【问题标题】:Restrict access to resource based on grant type in addition to scope除了范围之外,还根据授权类型限制对资源的访问
【发布时间】:2020-04-27 16:16:40
【问题描述】:

据我了解:-

  • oauth 客户端可以获得的范围在授权服务器上针对客户端注册。

  • 客户端可以使用的授权类型在授权服务器上针对客户端注册。

  • 资源配置为允许包含与特定范围关联的访问令牌的请求。

在普通 OAuth 中是否有一种机制,在限制端点时除了使用范围之外还使用授权类型?

例如,给定范围=组织、图像和授权类型=客户端凭据、身份验证代码的客户端 A:

(在创建令牌时)

  • 对于客户端 A 获取“组织”范围的访问令牌,只能使用客户端凭据授予类型。

  • 对于客户端 A 获取“图像”范围的访问令牌,只能使用授权码授权类型。

或者(当它调用的资源端点)

  • 当使用包含预期“组织”范围的访问令牌调用 /organisation 端点时,仅在使用客户端凭据授权类型获取访问令牌时才允许请求(如果任何其他授权类型被使用)。

  • 当使用包含预期“图像”范围的访问令牌调用 /images 端点时,仅在使用授权码授权类型获取访问令牌时才允许请求(如果任何其他授权类型则失败已使用)。

据我所知,范围仅受为客户注册的内容所限制。

我能想到实现上述目标的唯一方法是为同一个实际客户端 (A) 注册两个客户端(例如 b、c),并为客户端凭据授予类型和组织范围和客户端配置客户端“b” 'c' 用于授权代码授权类型和图像范围。

更新

一个选项是沿着 OIDC 行添加角色范围,这意味着角色声明将被添加到访问令牌中。然后可以检查访问令牌以查看角色是第三方(客户端凭据授予)还是用户(授权代码授予)。 我仍然很想知道 oauth 中是否有任何专门用于通过授权类型进行限制的内容。

【问题讨论】:

    标签: oauth-2.0


    【解决方案1】:

    令牌通常不记录授权信息,真正的要求是能够根据调用者的权限控制每个应用程序的访问。

    我总是为不同的授权类型配置不同的 OAuth 客户端 - 因为它们是不同的逻辑客户端,并且永远不能共享会话。

    一些可能的选择:

    • 选项 1. 使用多个 API,每个 API 都带有 different audience,并为不同的 OAuth 客户端配置不同的受众(如果您的授权服务器支持)

    • 选项 2. API 端点可能会根据允许的客户端 ID 列表检查访问令牌中的客户端 ID - 尽管这不是一个好的长期选项

    • 选项 3. 仅使用 OAuth 来识别调用者,然后查找调用者在应用程序数据中存储和管理的权限。这几乎总是最好的长期选择。

    OAuth 仅提供高级别的授权机制,当您深入了解特定领域的授权(例如角色的含义或规则,例如检查资金是否充足)时,它不会帮助您。

    我喜欢你使用角色的想法,根据经验我会这样管理它们:

    • 首先通过范围等进行高级 OAuth 授权
    • 从令牌的声明中识别调用者
    • 在您的应用程序数据中查找调用者的角色
    • 在您的 API 逻辑中强制执行角色的授权规则

    【讨论】:

    • 谢谢,证实了我的想法。
    猜你喜欢
    • 2016-06-13
    • 1970-01-01
    • 2021-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-19
    • 2013-10-15
    相关资源
    最近更新 更多