#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.