Я использую Spring Security для настройки аутентификации oauth2 в моем веб-приложении Spring Boot, которое работает за обратным прокси-сервером.
Поток:
1) Перейдите на страницу входа в приложение Spring
2) Перенаправление на oauth-провайдера.Вход в систему.
3) Перенаправление на мою конечную точку redirect-uri
4) Обрывы потока и печать страницы входа Spring по умолчанию:
Your login attempt was not successful, try again.
Reason: [invalid_redirect_uri_parameter]
Я включил отладку,консоль показывает:
2019-01-30 09:46:40.094 DEBUG 1 --- [nio-8080-exec-2] o.s.s.authentication.ProviderManager : Authentication attempt using org.springframework.security.oauth2.client.authentication.OAuth2LoginAuthenticationProvider
2019-01-30 09:46:40.094 DEBUG 1 --- [nio-8080-exec-2] o.s.s.authentication.ProviderManager : Authentication attempt using org.springframework.security.oauth2.client.oidc.authentication.OidcAuthorizationCodeAuthenticationProvider
2019-01-30 09:46:40.095 DEBUG 1 --- [nio-8080-exec-2] .s.o.c.w.OAuth2LoginAuthenticationFilter : Authentication request failed: org.springframework.security.oauth2.core.OAuth2AuthenticationException: [invalid_redirect_uri_parameter]
org.springframework.security.oauth2.core.OAuth2AuthenticationException: [invalid_redirect_uri_parameter]
at org.springframework.security.oauth2.client.oidc.authentication.OidcAuthorizationCodeAuthenticationProvider.authenticate(OidcAuthorizationCodeAuthenticationProvider.java:136) ~[spring-security-oauth2-client-5.0.8.RELEASE.jar!/:5.0.8.RELEASE]
Копирование кода OidcAuthorizationCodeAuthenticationProvider.java
показывает, что следующий оператор вызывает ошибку: (authorizationResponse.getRedirectUri().equals(authorizationRequest.getRedirectUri())
)
Я проверил запросы браузера.Параметр uri перенаправления моего первоначального запроса соответствует сайту, на который я перенаправлен после аутентификации на сайте провайдера.(В противном случае поставщик мог бы выдать ошибку несоответствия URI перенаправления.)
Согласно опыту другого пользователя (http://blog.davidvassallo.me/2018/08/10/lessons-learnt-of-spring-boot-oauth2-redirect-uris/) Spring Boot видит «localhost» при запуске за обратным прокси-сервером и, следовательно, redirect-uriбольше не равны (когда localhost не является правильным именем хоста).
Как я могу получить значения authorizationResponse.getRedirectUri()
и authorizationRequest.getRedirectUri()
? Я хочу посмотреть, какое перенаправление видит Spring Security. Консоль отладкине печатает эти значения.
Обновление: я создал конечную точку, которая печатает request.getRequestURL (). toString (), и на самом деле он печатает исходный URL-адрес, а не обратный URL-адрес прокси. Это может быть проблемой.