使用 Spring boot、Eureka、Zuul、Spring Oauth 创建 OAuth 安全微服务的问题
Issues creating OAuth secured Microservices using Spring boot, Eureka, Zuul, Spring Oauth
我正在尝试使用 Spring Boot、Eureka、Zuul 和 Spring OAuth 设置 Zuul 反向代理。具体来说,我正在尝试从 Zuul 后面的 OAuth 服务器获取 OAuth 持有者令牌。为此,我需要向重定向到我们的 OAuth 服务器的代理端点发出 POST 请求。此请求使用 client_credentials 授权类型,因此使用 BasicAuth 来获取不记名令牌。我已经验证可以绕过Zuul获取token
我一直无法获得我的预期结果,这是一个可识别 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);
}
}
但这默认启用了基本身份验证安全性。我知道这一点是因为我会在任何 POST 请求中收到 CSRF 错误。设置 security.enable-csrf=false
并没有禁用它(我觉得这很奇怪)。设置 security.basic.enabled=false
也没有禁用任何安全性也很奇怪。我终于注意到 @EnableOAuth2Sso
上的 JavaDoc 说如果没有提供 WebSecurityConfigurerAdapter
那么它将使用默认值。我尝试将 @EnableWebSecurity
添加到我应该添加 WebSecurityConfigurerAdapter
的配置中,但我的 POST 请求仍然出现 CSRF 错误。也许它的默认使用不知道 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 header 不再在请求中。 Zuul 似乎正在剥离 header。我是否误解了添加 @EnableOAuth2Sso
注释使应用程序了解 OAuth 并且它将允许访问已配置的 OAuth 服务器的方法,或者它是否仅适用于 Bearer 令牌?将您的 OAuth 服务器放在代理后面是正常的还是这不是预期的事情?我猜我遗漏了一些我尚未从文档中理解的重要知识 and/or 配置。
如有任何帮助,我们将不胜感激。
However, now my OAuth server is rejecting the requests because the BasicAuth header is no longer on the request
默认情况下 Spring 云 Zuul 实现为了安全目的去除一些 headers(参见 Cookies and sensitive headers documentation)
因此,由于 Spring 云 netflix 1.1 headers Cookie, Set-Cookie, Authorization
被认为是 明智的 headers
Is it normal to place your OAuth server behind the proxy or is that not an expected thing to do?
Spring cloud 基本上没有默认设计在代理(Zuul)后面有授权服务器(或OAuth服务器)。在大多数示例和文档中,授权服务器在代理之外。
我个人为 Proxy 背后的授权创建了一个 POC https://github.com/kakawait/uaa-behind-zuul-sample 可能会(或不会)帮助您。
我正在尝试使用 Spring Boot、Eureka、Zuul 和 Spring OAuth 设置 Zuul 反向代理。具体来说,我正在尝试从 Zuul 后面的 OAuth 服务器获取 OAuth 持有者令牌。为此,我需要向重定向到我们的 OAuth 服务器的代理端点发出 POST 请求。此请求使用 client_credentials 授权类型,因此使用 BasicAuth 来获取不记名令牌。我已经验证可以绕过Zuul获取token
我一直无法获得我的预期结果,这是一个可识别 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);
}
}
但这默认启用了基本身份验证安全性。我知道这一点是因为我会在任何 POST 请求中收到 CSRF 错误。设置 security.enable-csrf=false
并没有禁用它(我觉得这很奇怪)。设置 security.basic.enabled=false
也没有禁用任何安全性也很奇怪。我终于注意到 @EnableOAuth2Sso
上的 JavaDoc 说如果没有提供 WebSecurityConfigurerAdapter
那么它将使用默认值。我尝试将 @EnableWebSecurity
添加到我应该添加 WebSecurityConfigurerAdapter
的配置中,但我的 POST 请求仍然出现 CSRF 错误。也许它的默认使用不知道 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 header 不再在请求中。 Zuul 似乎正在剥离 header。我是否误解了添加 @EnableOAuth2Sso
注释使应用程序了解 OAuth 并且它将允许访问已配置的 OAuth 服务器的方法,或者它是否仅适用于 Bearer 令牌?将您的 OAuth 服务器放在代理后面是正常的还是这不是预期的事情?我猜我遗漏了一些我尚未从文档中理解的重要知识 and/or 配置。
如有任何帮助,我们将不胜感激。
However, now my OAuth server is rejecting the requests because the BasicAuth header is no longer on the request
默认情况下 Spring 云 Zuul 实现为了安全目的去除一些 headers(参见 Cookies and sensitive headers documentation)
因此,由于 Spring 云 netflix 1.1 headers Cookie, Set-Cookie, Authorization
被认为是 明智的 headers
Is it normal to place your OAuth server behind the proxy or is that not an expected thing to do?
Spring cloud 基本上没有默认设计在代理(Zuul)后面有授权服务器(或OAuth服务器)。在大多数示例和文档中,授权服务器在代理之外。
我个人为 Proxy 背后的授权创建了一个 POC https://github.com/kakawait/uaa-behind-zuul-sample 可能会(或不会)帮助您。