我有一个REST风格的API,它被一个浏览器前端和多个机器对机器客户端使用,所以我通过标准流(授权代码)和服务帐户流(客户端凭据)使用Keycloak 18来发布令牌。
API资源上的操作受read:resourceA
、update:resourceA
、read:resourceB
等作用域的保护。
将领域角色分配给客户端作用域时,如果将用户Map到同一领域角色,则通过授权代码流(浏览器前端)颁发的令牌将包含该作用域。
此外,当我创建机器对机器客户端并将客户端作用域直接添加到客户端时,M2M客户端的令牌也包含该作用域。
到目前为止一切都很好。但一旦我试图同时做这两件事,我就不再有M2M客户端发出的令牌的范围。
似乎将客户端作用域添加到角色会使其无法以其他方式使用该作用域。
一个明显但不好的解决方案是为这种客户端创建第二组作用域。
我正在从www.example.com迁移Auth0.com到Keycloak,而这是目前阻止我完成此迁移的唯一原因。
谢谢帕斯卡
2条答案
按热度按时间j1dl9f461#
在基于标准的方法中,作用域由声明组成。Scopes在设计时是固定的,而claims具有运行时值。因此,在运行时,特定的客户端和用户可能产生以下值:
一个例子是内置的
profile
作用域,它包括名称和电子邮件声明,在运行时可能如下所示:建议避免使用
scope explosion
,就像你建议的那样。在Keycloak中,我会保持所有客户端的作用域都相同,这样客户端界面就不会发生任何变化。一个
realm role
是一种声明,虽然我认为是一个特定于Keycloak的概念。也许你可以用不同的方式来表示它,或者也为M2M客户端配置一个领域角色?ltqd579y2#
事实证明,我错过了
Service Account Roles
的概念。对于所有遇到同样麻烦的人:如何将新角色添加到授权代码流客户端
如何添加新的M2M客户端
Service Account Roles
中,分配新的客户端角色