Как переслать параметры запроса внешнему поставщику удостоверений с помощью Keycloak?

#oauth #keycloak #openid-connect #identity

#oauth #keycloak #OpenID-connect #идентификация

Вопрос:

При создании поставщика удостоверений (IdP) в Keycloak доступна опция для пересылки параметров запроса внешнему IdP. Как я могу это использовать? введите описание изображения здесь

Я хочу переслать, скажем, launch параметр внешнему IdP. Я упомянул об этом launch в Forwarded Query Parameters поле на странице конфигурации Keycloak. Я использую приложение на моем, locahost:9090 защищенном Keyclaok. Когда я обращаюсь к http://localhost:9090?launch=abc этому параметру, он не переадресовывается внешнему IdP. Я использую keycloak-spring-boot-starter для нашего приложения Spring Boot.

Также из кода Keycloak я увидел, что к переадресованному параметру прикреплен некоторый префикс, т.Е. client_request_param_ поэтому я попытался использовать http://localhost:9090?client_request_param_launch=abc , но безуспешно.

AuthorizationEndpoint.LOGIN_SESSION_NOTE_ADDITIONAL_REQ_PARAMS_PREFIX = client_request_param_

 String forwardParameterConfig = getConfig().getForwardParameters() != null ? getConfig().getForwardParameters(): "";
List<String> forwardParameters = Arrays.asList(forwardParameterConfig.split("\s*,\s*"));
for(String forwardParameter: forwardParameters) {
    String name = AuthorizationEndpoint.LOGIN_SESSION_NOTE_ADDITIONAL_REQ_PARAMS_PREFIX   forwardParameter.trim();
    String parameter = request.getAuthenticationSession().getClientNote(name);
    if(parameter != null amp;amp; !parameter.isEmpty()) {
        uriBuilder.queryParam(forwardParameter, parameter);
    }
}
  

P.S: Я использую Keycloak 7.0.0.

Ответ №1:

У меня была такая же проблема с настройкой параметров acr_values в запросе авторизации. Я решил проблему, поместив параметр непосредственно в путь к конечной точке авторизации:

 https://YOUR_DOMAIN/oauth/authorize?acr_values=MY_VALUESamp;
  

Я не очень разбирался, почему параметр переадресованного запроса работал не так, как ожидалось (я использую Keycloak 14.0.0). Рад видеть, если кто-нибудь даст какое-нибудь объяснение позже здесь.

Ответ №2:

На всякий случай, если кто-нибудь столкнется с этим. Как реализовано в исходном коде, существует максимальное ограничение в 5 дополнительных параметров запроса (объявленных как константы: ADDITIONAL_REQ_PARAMS_MAX_MUMBER) для обработки дополнительных параметров запроса.

Дополнительные параметры запроса исключены из подмножества объявленных известных параметров запроса (KNOWN_REQ_PARAMS, объявленных здесь).

Пример,

 https://<domain>/openid-connect/auth?

scope=xx

amp;response_type=code

amp;client_id=xxx

amp;redirect_uri=xxx

amp;state=xxx

amp;addParam1=xx

amp;addParam2=xx

amp;addParam3=xx

amp;addParam4=xx

amp;addParam5=xx

amp;addParam6=xx (not processed)

amp;addParam7=xx (not processed)
  

Ссылаясь на исходный код, метод extractAdditionalReqParams будет обрабатывать только до addParam5 и после этого остановится.

Ответ №3:

Я предполагаю, что параметры пересылаемого запроса — это параметры, ОТЛИЧНЫЕ от OIDC, прикрепленные к исходному запросу потока кода — затем они пересылаются IdP, если они указаны в списке для этого IdP.