【问题标题】:Keycloak - Use Client scope with client_credentials and authorization code flowKeycloak - 将客户端范围与 client_credentials 和授权代码流一起使用
【发布时间】:2022-08-22 14:40:21
【问题描述】:

我有一个浏览器前端和多个机器对机器客户端使用的 RESTful API。因此,我通过标准流程(授权代码)和服务帐户流程(客户端凭据)使用 Keycloak 18 发布令牌。

对 API 资源的操作受到 read:resourceAupdate:resourceAread:resourceB 等范围的保护。

当我将领域角色分配给客户端范围时,如果我将用户映射到同一个领域角色,则通过授权代码流(浏览器前端)发布的令牌包含范围。

此外,当我创建机器对机器客户端并将客户端范围直接添加到客户端时,M2M 客户端的令牌也包含范围。

到目前为止,一切都很好。但是,一旦我尝试同时进行这两项操作,我就不再拥有 M2M 客户端发布的令牌的范围。

似乎将客户端范围添加到角色使得无法以其他方式使用该范围。

显而易见但不好的解决方案是为这种客户端创建第二组范围。还有其他我不知道的解决方案吗?

我正在从 Auth0.com 迁移到 Keycloak,这是目前唯一阻止我完成此迁移的点。

谢谢, 帕斯卡

    标签: oauth-2.0 authorization keycloak


    【解决方案1】:

    在基于标准的方法中,范围由权利要求组成。 Scopes 在设计时固定,而 claims 具有运行时值。因此,在运行时,特定的客户端和用户可能会产生以下值:

    - myscope
      - roles: [user, admin]
      - subscription-level: gold
    

    一个示例是内置的 profile 范围,其中包括名称和电子邮件声明,并且在运行时可能如下所示:

    - profile
      - name: John Doe
      - email: john@doe.io
    

    正如您所建议的,建议避免使用scope explosion。在 Keycloak 中,我会为所有客户端保持相同的范围,这样客户端界面就不会发生任何变化。

    realm role 是一种声明,尽管我认为是 Keycloak 特定的概念。也许您可以用不同的方式表示它,或者也为 M2M 客户端配置一个领域角色?

    【讨论】:

    • 谢谢回复!范围和声明之间的区别在我的脑海中确实有点模糊 :-) 在 Keycloak 中有领域角色(全局)和客户端角色(“命名空间”角色)。不过,客户端角色的问题仍然存在。在 JWT 中拥有范围似乎仅适用于 Role/User/AuthorizationCodeFlow 或直接附加到客户端的范围,而没有任何附加到角色。将范围附加到客户端角色也不会对令牌范围产生任何影响。
    • 感觉与将作用域附加到角色相关的行为是这里的问题。不过,角色只是一种声明,所以我可能会避免这样做,而可能会查看custom claims handling。这可能需要做更多的工作,但让架构正确是值得的。
    【解决方案2】:

    原来我错过了Service Account Roles的概念。对于所有遇到同样麻烦的人:

    如何向授权代码流客户端添加新角色

    • 创建启用默认流的客户端
    • 创建客户端角色
    • 在客户端范围设置中,将新客户端角色添加到范围
    • 在客户端设置中,将范围添加到默认范围列表中
    • 向用户添加新的客户端角色

    如何添加新的 M2M 客户端

    • 创建新客户端
    • 在客户端设置中创建一个新的客户端角色
    • 在客户端设置的标签Service Account Roles 中,分配新的客户端角色
    • 在客户端范围设置中,分配新的客户端角色
    • 在客户端设置中,将范围添加到默认范围列表中

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-04-06
      • 2017-03-04
      • 2020-10-12
      • 1970-01-01
      • 2020-03-01
      • 1970-01-01
      • 2018-03-13
      • 2018-04-28
      相关资源
      最近更新 更多