Hasura:通过 API 调用在运行时(动态地)更改 Hasura 中的 permissions/schema
Hasura: Change permissions/schema in Hasura on runtime (dynamically) through API call
我正在尝试通过 API 调用在运行时(动态地)更改 Hasura 中的权限,如下所示:
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"]
}
}
}'
但是returns和
{
"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
正如您在屏幕截图中看到的那样
你只把admin
放在x-hasura-role
Header中是不够的。如果您考虑一下,这将是一个巨大的漏洞,因为任何人都可以向您的后端发出此请求。您甚至在示例 CURL 请求中共享了端点!
相反,您需要将 x-hasura-admin-secret
Header 与您为部署配置的值一起传递。这个值应该受到高度保护,因为任何有权访问它的人都可以非常开放地访问 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"]
}
}
}
或者,如果您不想直接使用您的 Hasura 秘密,也可以使用使用 admin
角色签名的 JWT 进行调用。在这种情况下,您可以将其设置在 Authorization
header 中,并设置 x-hasura-role: admin
声明集
我正在尝试通过 API 调用在运行时(动态地)更改 Hasura 中的权限,如下所示:
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"]
}
}
}'
但是returns和
{
"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
正如您在屏幕截图中看到的那样
你只把admin
放在x-hasura-role
Header中是不够的。如果您考虑一下,这将是一个巨大的漏洞,因为任何人都可以向您的后端发出此请求。您甚至在示例 CURL 请求中共享了端点!
相反,您需要将 x-hasura-admin-secret
Header 与您为部署配置的值一起传递。这个值应该受到高度保护,因为任何有权访问它的人都可以非常开放地访问 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"]
}
}
}
或者,如果您不想直接使用您的 Hasura 秘密,也可以使用使用 admin
角色签名的 JWT 进行调用。在这种情况下,您可以将其设置在 Authorization
header 中,并设置 x-hasura-role: admin
声明集