Hasura: изменение разрешений / схемы в Hasura во время выполнения (динамически) через вызов API

#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 установленным утверждением