【问题标题】:How to model resource level permissions in JWT OAuth2 tokens?如何在 JWT OAuth2 令牌中建模资源级权限?
【发布时间】:2018-01-09 10:57:55
【问题描述】:

将资源级权限编码为 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]
}

还是别的什么?

这同样适用于“角色”或“会员资格”或类似标签(我意识到我已经混合了上面的示例) - 核心问题仍然是如何(最好)区分这些标签 per资源在单个 JWT access_token?

【问题讨论】:

  • 我是否理解正确,您有一些带有访问控制列表 (ACL) 的对象。您想创建一个 JWT 来反映这些 ACL 在令牌发行时的状态吗?你为什么要这样做?
  • @JánHalaša 是的,大致正确。其目的是封装用户的权限,不仅包括该用户拥有的资源,还包括他们已被授予访问权限的资源(例如,我邀请您编辑我的存储库)。

标签: oauth-2.0 token jwt access-token


【解决方案1】:

我不知道您需要实现的确切用例,但我可能会尝试保留仅用于 API 操作的范围。例如“获取存储库列表”。然后使用访问令牌的客户端可以列出它可以使用的存储库,资源服务器通过用户名或用户组验证访问权限。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-09-18
    • 2015-04-16
    • 2018-08-03
    • 2016-10-13
    • 2018-11-19
    • 1970-01-01
    • 2014-10-27
    • 2021-05-22
    相关资源
    最近更新 更多