Keycloak: предоставленная область не сохраняется для федеративных пользователей - PullRequest
0 голосов
/ 08 января 2020

Проблема:

У меня есть сфера Keycloak со смешанной базой пользователей. Некоторые пользователи являются нативными (нативными), некоторые предоставляются через пользовательскую реализацию SPI пользовательского хранилища (федеративные пользователи).

Когда я выполняю вход с OID C, Keycloak просит утвердить 4 области (test-client) , профиль, электронная почта, роли). Запрос выполняется с областью действия openid . Keycloak превращает его в эти четыре области. test-client - это имя клиента. Нет реальной клиентской области с таким именем, отображаемой в пользовательском интерфейсе администратора.


При использовании собственного пользователя все работает нормально. Я одобряю, и вход в систему завершается успешно.

Просмотр согласия пользователя подтверждает, что все в порядке. enter image description here


Использование федеративного пользователя при входе в систему происходит сбой со следующим сообщением.

[invalid_scope] Client no longer has requested consent from user

Просмотр согласия пользователей мы видим, что область действия test-client не добавляется. enter image description here

Попытка обменять код на токен выдает ошибку подбора в журнале Keycloak

11:06:31,964 WARN  [org.keycloak.events] (default task-10) type=CODE_TO_TOKEN_ERROR, realmId=torment, clientId=test-client, userId=f:ff4c66e5-2a6f-465c-8418-200648a49973:dfb_user, ipAddress=127.0.0.1, error=not_allowed, grant_type=authorization_code, code_id=418dfa66-b4c8-4481-b46d-ceac97e65b39, client_auth_method=client-secret

При всех последующих попытках входа в систему будет запрашиваться только подтверждение отсутствует test-client область действия, но она никогда не будет добавлена ​​к согласию.


Вопрос:

  1. Почему это происходит?
  2. Как мне заставить это работать?

1 Ответ

0 голосов
/ 08 января 2020

Похоже, вы не передаете список областей в качестве параметров запроса в URL-адресе, созданном для инициации аутентификации Keycloak. Пожалуйста, проверьте ваш аутентификационный URL.

 Set<ClientScopeModel> clientScopes = TokenManager.getRequestedClientScopes(scopeParam, client);
        if (!TokenManager.verifyConsentStillAvailable(session, user, client, clientScopes)) {
            event.error(Errors.NOT_ALLOWED);
            throw new CorsErrorResponseException(cors, OAuthErrorException.INVALID_SCOPE, "Client no longer has requested consent from user", Response.Status.BAD_REQUEST);
        }

Ваша ошибка исходит от здесь . Если вы посмотрите на TokenManager.getRequestedClientScopes (номер строки 523), он проверяет, предоставил ли пользователь все еще согласия на все запрошенные клиентские области. Итак, я думаю, что вы можете попытаться добавить все области в URL запроса. Например, http://keycloak_url / auth / realms / .......? .... scope = openid% 20test_client% 20profile ..... Надеюсь, это поможет. enter image description here Кроме того, этот параметр можно включить в клиенте Keycloak (вкладка Области).

...