Сервер авторизации Spring OAuth за прокси-сервером Spring Cloud Zuul
В настоящее время я занимаюсь разработкой приложения на основе микросервисной архитектуры. Мы используем API-шлюз, реализованный с использованием Zuul Server Spring Cloud Netfix, для маршрутизации запросов к нашим микро-сервисам.
Для реализации единого входа для всех наших служб в настоящее время я работаю на сервере OAuth2, настроенном с использованием Spring Cloud Security. Сервер в основном просто копия и прошлая реализация в репо Дейва Сайера: https://github.com/dsyer/spring-security-angular/tree/master/oauth2/authserver
Основное отличие состоит в том, что я хочу направлять запросы на мой сервер OAuth через прокси Zuul. Таким образом, мне не придется напрямую выставлять мой OAuth-сервер, и я могу динамически добавлять и удалять Login Server.
Проблема в том, что я не шва, чтобы понять, как правильно настроить эту настройку. Когда я пытаюсь получить доступ к защищенному ресурсу на сервере OAuth, меня перенаправляют на страницу входа. Это, конечно, как и ожидалось. Но я не могу понять, как установить имя хоста и порт, используемый при пересылке. Я хочу, чтобы сервер переадресовал конечную точку на сервере Zuul, которая будет перенаправлена обратно на сервер OAuth. (API-шлюз Zuul должен быть единственным сервером, с которым когда-либо общался клиент. Все остальное будет скрыто.)
Так как это хост и порт читаются из HttpServletRequest
в LoginUrlAuthenticationEntryPoint
, Но запрос, который видит сервер, является запросом, отправленным прокси Zuul. Поэтому я перенаправлен на внутренний IP, а не на конечную точку прокси.
Я пытался установить URL-адрес страницы входа в WebSecurityConfigurerAdapter.configure(HttpSecurity)
на абсолютный URL моего Zuul Proxy. Но из-за этого мое приложение жаловалось на слишком много перенаправлений. (Возможно, там возникла петля.)
Как лучше всего это настроить?
- Должен ли я реализовать какую-то собственную стратегию пересылки, переопределив бин?
- Есть ли опция конфигурации, которую мне не хватает?
- Моя идея сама по себе неверна? (В своем ответе на вопрос " Как избежать перенаправления на другой хост с Zuul? Дейв Сайер говорит, что вы обычно не будете использовать прокси-сервер, но не объясняет почему.)
2 ответа
Обновление: POC можно найти здесь https://github.com/kakawait/uaa-behind-zuul-sample
Вы пробовали следующие настройки (на zuul
сервер):
zuul:
routes:
uaa-service:
path: /uaa/**
stripPrefix: false
security:
# Disable Spring Boot basic authentication
basic:
enabled: false
oauth2:
sso:
loginPath: /login
client:
accessTokenUri: https://<zuul hostname>/uaa/oauth/token
userAuthorizationUri: https://<zuul hostname>/uaa/oauth/authorize
...
В основном это работает на моем проекте, единственное, что мне нужно сделать, это отключить CSRF
защита на /uaa/oauth/token
маршрут.
Сервер аутентификации должен быть включен
server:
# Use different context-path to avoid session cookie overlapping
context-path: /uaa
Протестировано с использованием Spring-Cloud.Brixton.M3
Спасибо Thomas Letsch, вам нужно настроить безопасность следующим образом (пример)
public void configure(HttpSecurity http) throws Exception {
http.logout().and()
.antMatcher("/**").authorizeRequests()
.antMatchers("/index.html", "/home.html", "/", "/uaa/oauth/**").permitAll()
.anyRequest().authenticated().and()
.csrf().csrfTokenRepository(getCSRFTokenRepository()).ignoringAntMatchers("/uaa/oauth/token").and()
.addFilterAfter(createCSRFHeaderFilter(), CsrfFilter.class);
}
Насколько я понимаю твой вопрос, spring-cloud-security
(для EnableOauth2Sso
часть) и spring-cloud
(для zuul), это не возможно для прокси-вызовов на сервер авторизации с помощью zuul. Основная причина в том, что spring-cloud-security
защищает шлюз независимо (и до учета) логики маршрутизации Zuul.
Это означает, что (пример конфигурации из примера Дэйва Сайера OAuth2) spring.oauth2.client.*
конфигурация
spring:
oauth2:
client:
accessTokenUri: http://localhost:9999/uaa/oauth/token
userAuthorizationUri: http://localhost:9999/uaa/oauth/authorize
clientId: acme
clientSecret: acmesecret
считается, прежде чем разрешить любой доступ к маршрутам Zuul zuul.routes.*
Кроме того, эта настройка позволяет клиентскому агенту хранить два файла cookie: один для шлюза и один для сервера авторизации.
Надеюсь, это поможет.