如何在 JWT OAuth2 令牌中对资源级权限进行建模?

How to model resource level permissions in JWT OAuth2 tokens?

将资源级权限编码为 JWT access_token 的规范方法是什么?或者换句话说,您如何最好地编码对他人资源的访问?

是不是这样的:

{
  scopes: {
    me: ['user', 'repo'],      // My user
    repo123: ['repo'],         // Someone else's repo
    org541: ['admin', 'repo'], // My org
    org206: ['repo:read']      // Someone else's org
  }
}

或者像这样,使用命名空间范围标签(在本例中 <resource>|<scope>:

{
  scopes: ['me|user', 'me|repo', 'repo123|repo', 'org541|admin'... etc]
}

还是别的?

这同样适用于 "roles" 或 "memberships" 或类似的标签(我意识到我已经混合了上面的例子)——核心问题仍然是你如何(最好)区分这些标签 每个资源 在单个 JWT access_token?

我不知道您需要实施的确切用例,但我可能会尝试将范围仅用于 API 操作。比如"get a list of repositories"。然后使用访问令牌的客户端可以列出它可以使用的存储库,资源服务器通过用户名或用户组验证访问权限。

如果你想限制客户端可用的资源,你可以有一个范围,只授予对一个子集的访问权限(例如,只授予用户自己的存储库)。

将资源及其权限编码在范围内会使它们难以使用(在编写身份验证请求时,客户端会知道资源标识符)并且权限可能会在访问令牌的生命周期内发生变化。