【问题标题】:Keycloak uma-grant type tickets for service accounts do not seem to work with policies服务帐户的 Keycloak uma-grant 类型票证似乎不适用于策略
【发布时间】:2019-06-03 14:39:21
【问题描述】:

我正在尝试使用 Keycloak AuthzClient 在资源服务器中注册资源和相​​关权限。

我有一个启用了 authz 服务的资源服务器“resourceserver”。

使用 AuthzClient,使用包含资源服务器的客户端 ID 和机密的 json 文件进行初始化,我可以获得一个 pat。

    ...
    authzClient.obtainAccessToken().getToken();
    ResourceRepresentation resource = new ResourceRepresentation();
    resource.setName("myresource");
    resource.setUris(new HashSet<>(Collections.singletonList("urn:resourceserver:resourcetype1:myresource")));
    resource.setOwnerManagedAccess(true);
    resource.setType("urn:resourceserver:resourcetype1");
    resource.addScope("read", "write");
    resource = authzClient.protection(pat).resource().create(resource);


    UmaPermissionRepresentation permissionRepresentation = new UmaPermissionRepresentation();
    permissionRepresentation.setName("myresourcepermissions");
    permissionRepresentation.setDescription("foo");
    permissionRepresentation.addRole("somerole");
    UmaPermissionRepresentation result = authzClient.protection(pat).policy(resource.getId()).create(permissionRepresentation)

执行此代码后,我可以在 keycloak 管理 UI 中看到已创建资源和范围,但似乎没有显示策略/权限。

我相信这可能是有意的,因为这个 keycloak 管理 UI 只显示类型为客户端、角色、js 等的策略,而不是 UmaPermissionRepresentation 创建的“uma”。

但是,通过我的 pat 查询 authz/protection/uma-policy,我可以看到 Keycloak 中存在该策略。

所以那里有些东西。现在测试它。我创建了一个普通用户并为其分配了领域角色somerole。使用这个用户和一些任意的公共客户端,我可以获得一个 RPT。

首先使用密码授权获取访问令牌:

grant_type=password&amp;username=joe&amp;password=password&amp;client_id=somepublicclient

然后将其换成 RPT:

grant_type=urn:ietf:params:oauth:grant-type:uma-ticket&amp;audience=resourceserver

RPT 回来了,如果我查看它的内容,我可以看到授权块允许我访问 myresource 资源。

但是,当我尝试使用服务帐户(我还向其授予 somerole 角色)使用客户端凭据流来获取初始访问令牌的类似流程时:

grant_type=client_credentials&amp;client_id=serviceaccount1&amp;client_secret=77c1ffa8-0ea8-420c-ad45-e1a69a03838d

我能够获得一个 RPT,但该 RPT 在授权/权限块中不包含 myresource,只有默认资源。

我一直试图理解为什么会这样。我还尝试在 UmaPermissionRepresentation 中使用.addClient("serviceaccount1") 甚至.addUser("service-account-serviceaccount1"),但是,该策略似乎没有生效,我的服务帐户无权访问该资源。

这是使用 Keycloak 4.8.0.Final。

注意:使用 keycloak 管理客户端,我能够创建实际执行此操作的策略/权限;但在我的环境中,这会导致其他问题,因为我需要分配给管理客户端的角色(例如查看所有客户端以检索 id 等)

【问题讨论】:

    标签: permissions authorization keycloak authz


    【解决方案1】:

    我对 KeyCloak 11.0.2 也有同样的问题。 共享资源不会最终出现在服务帐户的权限票中。授权令牌服务中的服务帐户为explicitly excluded。 由于可以与服务帐户共享资源,这似乎不一致。

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

    .

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-15
      • 2010-10-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多