Я пытаюсь настроить обратный прокси-сервер Zuul с помощью Spring Boot, Eureka, Zuul и Spring OAuth. В частности, я пытаюсь получить токен носителя OAuth с нашего сервера OAuth, который находится за Zuul. Для этого мне нужно сделать запрос POST к конечной точке прокси, которая перенаправляет на наш сервер OAuth. В этом запросе используется тип предоставления client_credentials, поэтому я использую BasicAuth для получения токена носителя. Я подтвердил, что могу получить токен, минуя Зуула.
У меня возникли проблемы с получением ожидаемых результатов, которые представляют собой обратный прокси-сервер, который поддерживает OAuth, но не имеет необходимой безопасности. Я пробовал несколько разных вариантов конфигурации и не могу найти золотой билет.
Вот мой Maven:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.mycompany.cloud</groupId>
<artifactId>mycompany-cloud</artifactId>
<version>0.0.2-SNAPSHOT</version>
</parent>
<artifactId>mycompany-cloud-zuul-proxy</artifactId>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zuul</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.security.oauth</groupId>
<artifactId>spring-security-oauth2</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Brixton.SR2</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>1.3.5.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
Изначально я создал конфигурацию, которая была просто
@SpringBootApplication
@EnableZuulProxy
@EnableEurekaClient
@EnableOAuth2Sso
public class ZuulProxyApplication {
public static void main(final String[] args) {
SpringApplication.run(ZuulProxyApplication.class, args);
}
}
но по умолчанию включена базовая безопасность аутентификации. Я знал это, потому что получал ошибки CSRF при любом запросе POST. Установка security.enable-csrf=false
не отключила это (я нашел это странным). Установка security.basic.enabled=false
тоже не отключила никакой безопасности, тоже странно. Наконец я заметил, что JavaDoc на @EnableOAuth2Sso
говорит, что если WebSecurityConfigurerAdapter
не был предоставлен, он будет использовать значение по умолчанию. Я попытался добавить @EnableWebSecurity
в свою конфигурацию, которая должна была добавить WebSecurityConfigurerAdapter
, но я все еще получал ошибки CSRF в моих запросах POST. Возможно, его использование по умолчанию не знает SecurityProperties. Итак, я получил такую конфигурацию:
@SpringBootApplication
@EnableZuulProxy
@EnableEurekaClient
public class ZuulProxyApplication {
public static void main(final String[] args) {
SpringApplication.run(ZuulProxyApplication.class, args);
}
@Configuration
@EnableOAuth2Sso
@EnableWebSecurity
@Order(SecurityProperties.ACCESS_OVERRIDE_ORDER)
protected static class SecurityConfiguration extends WebSecurityConfigurerAdapter {
@Autowired
public void globalUserDetails(final AuthenticationManagerBuilder auth) throws Exception {
// add no users
auth.inMemoryAuthentication();
}
@Override
protected void configure(final HttpSecurity http) throws Exception {
http.csrf().disable();
}
}
}
и следующие свойства:
spring:
application:
name: mycompany-cloud-zuul-proxy
index: 0
security:
oauth2:
client:
access-token-uri: http://mycompany-cloud-authorization-server/oauth/token
user-authorization-uri: http://mycompany-cloud-authorization-server/oauth/authorize
basic:
enabled: false
enable-csrf: false
sessions: stateless
server:
port: 9200
eureka:
client:
service-url:
defaultZone: http://localhost:9100/eureka/
И это было успешно, он отключил конфигурацию CSRF, и я смог отправлять запросы POST к своим службам, не получая ошибки CSRF. Однако теперь мой сервер OAuth отклоняет запросы, потому что заголовок BasicAuth больше не находится в запросе. Похоже, что Зуул срывает заголовок. Я неправильно понимаю, что добавление аннотации @EnableOAuth2Sso
сообщает приложению OAuth и что это позволяет получить доступ к настроенному серверу OAuth, или это просто применимо к токенам носителя? Нормально ли размещать сервер OAuth за прокси-сервером или этого не следует делать? Я предполагаю, что мне не хватает некоторых важных знаний и / или конфигурации, которые мне еще предстоит понять из документации.
Любая помощь здесь будет оценена по достоинству.