Похоже, что тикеты типа «ключ-ума» для учетных записей служб не работают с политиками - PullRequest
0 голосов
/ 09 января 2019

Я пытаюсь использовать 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, я могу создавать политики / разрешения, которые фактически делают эту работу; но в моей среде это вызвало бы другие проблемы из-за ролей, которые мне нужно было бы назначить клиенту администратора (например, просмотр всех клиентов для получения идентификатора и т. д.)

...