如果我理解正确,要使用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-role
标头的值分配的角色是否具有从请求体执行查询的权限
据我所知,这意味着有人可以通过将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
声明限制为仅分配给基于我的身份验证服务的每个用户的角色?
您的理解似乎是正确的,这不是一个安全漏洞。
我是否只是将jwt的
x-hasura-allowed-roles
声明限制为仅分配给基于我的身份验证服务的每个用户的角色?
没错。在本文档中(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
标头的可接受值