Keycloak无法使用服务帐户令牌获得具有权限的RPT

时间:2019-08-21 12:18:14

标签: java keycloak

我正在使用Keycloak:4.8.3.Final

我在Keycloak中拥有以下客户端

  • UserService

  • InventoryService

InventoryService 具有在Keycloak中定义的一些资源并启用了授权。

UserService (作为服务帐户)在 service-account-roles 标签

中分配了必要的客户端角色

每当有人尝试访问InventoryService的API时,我都会执行以下操作:

  • 从授权标头中获取访问令牌
  • 获取RPT(如here所述)
  • 了解RPT是否存在所需的权限。

当UserService尝试访问InventoryService的api时,我收到以下错误响应

{
  "error": "invalid_resource",
  "error_description": "Resource with id [item] does not exist."
}

这是Java中的代码段。

当UserService尝试访问InventoryService的api时,我收到以下错误响应

AuthorizationResource authResource = authzClient.authorization(at);
AuthorizationRequest request = new AuthorizationRequest();
request.addPermission(resourceId, scopes);
AuthorizationResponse authResponse = authResource.authorize(request);
String rpt = authResponse.getToken();

当我删除行时 request.addPermission(resourceId,范围); 我能够获得带有所有权限列表的RPT。但如果包含它,则会抛出上述错误。

顺便说一句,另外一个观察结果是:当令牌属于用户(而不是服务帐户)时,上述代码段可以正常工作。

能让我知道发生了什么吗?这是Keycloak中的错误吗?

1 个答案:

答案 0 :(得分:0)

此问题在KeyCloak 11.0.2中仍然存在。服务帐户是授权令牌服务中的explicitly excluded

不过,您可以通过客户端上的协议映射器将azp声明明确设置为client_id以外的其他内容来解决此问题。

protocol mapper on your client