如果我理解正确,要使用 JWT 在 hasura 中授权查询或突变,请求本身需要满足一些要求,即:
Authorization: Bearer <token here> x-hasura-role: user myQuery {
id
name
another_field
}
Run Code Online (Sandbox Code Playgroud)
当请求被发送到 hasura 端点时,hasura GraphQL 引擎将尝试
x-hasura-role请求头中设置的值是否存在于x-hasura-allowed-rolejwt的声明中x-hasura-roleheader的值分配的角色是否有权限从请求体执行查询据我了解,这意味着有人可以通过将 的值设置为 JWT 声明中x-hasura-role存在的其他内容来“伪造”对 hasura GraphQL 引擎的请求x-hasura-allowed-roles。例如,如果x-hasura-allowed-roles索赔是这样的
{
...
'x-hasura-allowed-roles': ['role1','role2'],
'x-hasura-default-role': 'role1',
'x-hasura-user-id': username
}
}
Run Code Online (Sandbox Code Playgroud)
那么这意味着应该只分配给角色 1 的人可以执行仅限于角色 2 的查询,只需x-hasura-role将请求中的标头设置为x-hasura-role: role2
我的理解正确吗?如果是,避免这种情况的最佳方法是什么,因为它似乎是一个安全漏洞?我是否只是x-hasura-allowed-roles将 jwt的声明限制为仅根据我的身份验证服务分配给每个用户的角色?
小智 5
您的理解似乎是正确的,它不是安全漏洞。
我是否只是
x-hasura-allowed-roles将 jwt的声明限制为仅根据我的身份验证服务分配给每个用户的角色?
完全正确。在本文档(https://hasura.io/docs/1.0/graphql/manual/auth/authentication/jwt.html)中,关键信息在这里:
JWT 被解码,签名被验证,然后断言用户的当前角色(如果在请求中指定)在允许的角色列表中。如果请求中未指定当前角色,则应用默认角色。
因此,您的身份验证服务器发布特定于该用户的允许角色(和默认角色)列表很重要;似乎 Hasura 正在支持具有此功能的多角色用户。例如,管理员可能能够使用用户角色“登录”,或者用户的角色在应用程序的不同上下文中可能不同。
对于这些字段的更具体定义:
- 甲
x-hasura-default-role字段:指示用户的默认角色,即,将在的情况下使用的作用x-hasura-role头不通过。- 甲
x-hasura-allowed-roles字段:用于用户允许角色的列表,即可接受的值x-hasura-role标题。
| 归档时间: |
|
| 查看次数: |
722 次 |
| 最近记录: |