【发布时间】:2020-07-12 18:35:06
【问题描述】:
如果我理解正确,要使用 JWT 在 hasura 中授权查询或突变,请求本身需要满足一些要求,即:
- JWT 本身,显示在请求标头中
Authorization: Bearer <token here> - x-hasura-role,出现在请求头中(可选)
x-hasura-role: user - 请求正文中显示的实际查询或突变
myQuery {
id
name
another_field
}
当请求被发送到 hasura 端点时,hasura GraphQL 引擎将尝试
- 验证 JWT
- 检查请求头中设置的
x-hasura-role的值是否存在于jwt的x-hasura-allowed-role声明中 - 如果所有条件都满足,那么 GraphQL 引擎会检查从
x-hasura-roleheader 的值分配的角色是否有权限从请求体执行查询
据我了解,这意味着某人可以通过将 x-hasura-role 的值设置为 JWT 的 x-hasura-allowed-roles 声明中存在的其他值来“伪造”对 hasura GraphQL 引擎的请求。例如,如果 x-hasura-allowed-roles 声明是这样的
{
...
'x-hasura-allowed-roles': ['role1','role2'],
'x-hasura-default-role': 'role1',
'x-hasura-user-id': username
}
}
那么这意味着应该只分配给角色 1 的人只能通过将请求中的 x-hasura-role 标头设置为 x-hasura-role: role2 来执行仅限于角色 2 的查询
我的理解正确吗?如果是,那么避免这种情况的最佳方法是什么,因为它似乎是一个安全漏洞?我是否仅将 jwt 的 x-hasura-allowed-roles 声明限制为仅根据我的身份验证服务分配给每个用户的角色?
【问题讨论】: