如果我正确理解,要使用JWT在hasura授权查询或突变,需要在请求本身中满足几个要求,即:
请求头中显示的
Authorization: Bearer <token here> (可选)x-hasura-role: user
中显示的实际查询或突变
myQuery {
id
name
another_field
}然后,当请求被发送到hasura端点时,hasura GraphQL引擎将尝试
x-hasura-role值是否存在于jwtx-hasura-allowed-role声明中,如果满足所有条件,则GraphQL引擎将检查从x-hasura-role标头值分配的角色是否具有从请求体<代码>H 220G 221执行查询的权限。据我理解,这意味着有人可以通过将GraphQL的值设置为JWT的x-hasura-role声明中存在的其他东西来“伪造”对hasura x-hasura-allowed-roles引擎的请求。例如,如果x-hasura-allowed-roles声明是这样的
{
...
'x-hasura-allowed-roles': ['role1','role2'],
'x-hasura-default-role': 'role1',
'x-hasura-user-id': username
}
}然后,这意味着应该只分配给role1的人只能通过将请求中的x-hasura-role头设置为x-hasura-role: role2来执行仅限于x-hasura-role: role2的查询。
我的理解正确吗?如果是的话,避免这种情况的最佳方法是什么,因为这似乎是一个安全漏洞。我是否只是将jwt的x-hasura-allowed-roles声明限制在基于我的身份验证服务分配给每个用户的角色上?
发布于 2020-04-01 04:58:01
您的理解似乎是正确的,而且它不是一个安全漏洞。
--我是否只是将jwt的
x-hasura-allowed-roles声明限制在基于身份验证服务分配给每个用户的角色上?
完全正确。在本文档(https://hasura.io/docs/1.0/graphql/manual/auth/authentication/jwt.html)中,关键信息如下:
JWT被解码,签名被验证,然后断言用户的当前角色(如果在请求中指定)在允许的角色列表中。如果请求中未指定当前角色,则应用默认角色。
因此,重要的是,您的auth服务器发布特定于该用户的允许角色(和默认角色)列表;看起来Hasura使用此功能支持多角色用户。例如,管理员可能能够使用用户角色“登录为”,或者用户的角色在应用程序的不同上下文中可能有所不同。
关于这些领域的更具体定义:
x-hasura-default-role字段:指示该用户的默认角色,即在x-hasura-role标头未被传递时将使用的角色。x-hasura-allowed-roles字段:用户允许的角色列表,即x-hasura-role标头的可接受值。G 217
https://stackoverflow.com/questions/60963627
复制相似问题