我正在尝试使用Keycloak AuthzClient在资源服务器中注册资源和相关权限。
我有一个启用了authz服务的资源服务器“ resourceserver”。
使用AuthzClient(使用包含资源服务器的客户端ID和密码的json文件初始化),我可以获取拍子。
...
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中看到已创建资源和范围,但是似乎未显示策略/权限。
我相信这可能是有意的,因为此密钥库管理用户界面仅显示客户端,角色,js等类型的策略,而不显示UmaPermissionRepresentation创建的“ uma”类型。
但是,通过用我的拍子查询authz/protection/uma-policy
,我可以看到Keycloak中存在该策略。
所以那里有些东西。现在进行测试。我创建了一个普通用户,并将其分配给领域角色somerole
。使用该用户和一些任意的公共客户端,我可以获得RPT。
首先使用密码授予获取访问令牌:
grant_type=password&username=joe&password=password&client_id=somepublicclient
然后将其替换为RPT:
grant_type=urn:ietf:params:oauth:grant-type:uma-ticket&audience=resourceserver
RPT返回,如果我查看其内容,则可以看到授权块,使我可以访问myresource资源。
但是,当我使用客户凭据流尝试使用服务帐户(我也授予了somerole
角色)的类似流程时,获得了初始访问令牌:
grant_type=client_credentials&client_id=serviceaccount1&client_secret=77c1ffa8-0ea8-420c-ad45-e1a69a03838d
我能够获得RPT,但该RPT在授权/权限块中不包含myresource,仅包含Default资源。
我一直试图理解为什么。我也尝试过在UmaPermissionRepresentation中使用.addClient("serviceaccount1")
甚至.addUser("service-account-serviceaccount1")
,但是该策略似乎没有生效,并且我的服务帐户无法访问该资源。
这是使用Keycloak 4.8.0.Final。
注意:使用keycloak admin客户端,我可以创建使这项工作切实可行的策略/权限;但是在我的环境中,这会导致其他问题,因为我需要分配给管理客户端(例如查看所有客户端以检索ID等)。
答案 0 :(得分:0)
我在KeyCloak 11.0.2中有同样的问题。 共享资源不会最终出现在服务帐户的许可凭单中。服务帐户是授权令牌服务中的explicitly excluded。 由于可以与服务帐户共享资源,因此这似乎不一致。
但是,您可以通过客户端上的协议映射器将azp
声明明确设置为client_id
以外的其他内容来解决此问题。