#runtime #schema #metadata #hasura
#время выполнения #схема #метаданные #hasura
Вопрос:
Я пытаюсь изменить разрешения в Hasura во время выполнения (динамически) с помощью вызова API следующим образом:
curl --location --request POST 'https://hasura-0ccfcde0.nhost.app/v1/query'
--header 'x-hasura-role: admin'
--header 'Content-Type: application/json'
--data-raw '{
"type" : "create_update_permission",
"args" : {
"table" : "customers",
"role" : "users",
"permission" : {
"check" : {
"user_id" : {
"_ne": ""
}
},
"filter" : {
"user_id" : "X-Hasura-User-Id"
},
"set":{
"name":"X-Hasura-User-Id"
},
"columns":["name","email"]
}
}
}'
Но он возвращается с
{
"path": "$.args",
"error": "restricted access : admin only",
"code": "access-denied"
}
Я следую: https://hasura.io/docs/1.0/graphql/core/api-reference/schema-metadata-api/permission.html#create-update-permission
как вы также можете видеть на скриншоте
Комментарии:
1. Есть ли у вашего Hasura
x-hasura-admin-secret
набор?
Ответ №1:
Вам недостаточно просто вставить admin
x-hasura-role
заголовок. Если вы подумаете об этом, это было бы огромной уязвимостью, поскольку любой мог отправить этот запрос вашему бэкэнду. Вы даже поделились конечной точкой здесь в своем примере запроса CURL!
Вместо этого вам нужно передать x-hasura-admin-secret
заголовок со значением, которое вы настроили для своего развертывания. Это значение должно быть тщательно защищено, поскольку любой, у кого есть к нему доступ, имеет довольно широкий открытый доступ к Hasura и, возможно, ко всей вашей базе данных на данный момент, в зависимости от того, как выглядит ваша конфигурация Hasura
curl --location --request POST 'https://hasura-0ccfcde0.nhost.app/v1/query'
--header 'x-hasura-admin-secret: whatever-your-configured-admin-secret-is'
--header 'Content-Type: application/json'
--data-raw '{
"type" : "create_update_permission",
"args" : {
"table" : "customers",
"role" : "users",
"permission" : {
"check" : {
"user_id" : {
"_ne": ""
}
},
"filter" : {
"user_id" : "X-Hasura-User-Id"
},
"set":{
"name":"X-Hasura-User-Id"
},
"columns":["name","email"]
}
}
}
В качестве альтернативы, выполнение вызова с помощью JWT, который подписан с admin
помощью роли, также может работать, если вы не хотите напрямую использовать свой секрет Hasura. В этом случае вы должны установить его в Authorization
заголовке с x-hasura-role: admin
установленным утверждением