Я пытаюсь использовать Keycloak AuthzClient для регистрации ресурсов и соответствующих разрешений на сервере ресурсов.
У меня есть ресурсный сервер "resourceserver" с включенной службой авторизации.
Используя AuthzClient, инициализированный файлом 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, что ресурс создан, и области действия, однако политика / разрешение, кажется, не отображаются.
Я полагаю, что это, вероятно, предназначено, поскольку этот пользовательский интерфейс администратора keycloak показывает только политики типов client, role, js и т. Д., Но не "uma", который создает UmaPermissionRepresentation.
Однако я вижу, что в Keycloak существует политика, запрашивая authz/protection/uma-policy
с моим патом.
Так что там что-то есть. Сейчас проверяю это. Я создал обычного пользователя и назначил ему роль царства 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 в блоке авторизации / разрешения, только ресурс по умолчанию.
Я пытался понять, почему это так. Я также пытался использовать .addClient("serviceaccount1")
или даже .addUser("service-account-serviceaccount1")
в UmaPermissionRepresentation, но, тем не менее, политика, похоже, не срабатывает, и моя учетная запись службы не имеет доступа к ресурсу.
Используется Keycloak 4.8.0.Final.
Примечание: используя клиент администратора keycloak, я могу создавать политики / разрешения, которые фактически делают эту работу; но в моей среде это вызвало бы другие проблемы из-за ролей, которые мне нужно было бы назначить клиенту администратора (например, просмотр всех клиентов для получения идентификатора и т. д.)