在反向代理后面使用 OAuth2 的 Spring Boot

Posted

技术标签:

【中文标题】在反向代理后面使用 OAuth2 的 Spring Boot【英文标题】:Spring Boot with OAuth2 behind reverse proxy 【发布时间】:2019-05-01 09:23:38 【问题描述】:

我是 Spring Security 的新手,并尝试使用在主机名:8080 下运行的 OAuth2 开发带有 Google 登录的 Spring Boot 应用程序。此应用位于 Apache 反向代理服务器 https://url.com 后面。

Spring Boot 2.1.0 版

Spring Security 5.1.1 版

build.gradle:

dependencies 
    implementation("org.springframework.boot:spring-boot-starter-web")
    implementation("org.springframework.boot:spring-boot-starter-security")
    implementation("org.springframework.security:spring-security-oauth2-client")
    implementation("org.springframework.security:spring-security-oauth2-jose")

application.yml:

oauth2:
  client:
    registration:
      google:
        clientId: <clientId>
        clientSecret: <clientSecret> 
        scope: profile, email, openid

server:
  use-forward-headers: true
  servlet:
    session:
      cookie:
        http-only: false

Spring 安全配置:

@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter 

    @Override
    protected void configure(HttpSecurity http) throws Exception 
        http
            .csrf()
                .disable()
            .authorizeRequests()
                .anyRequest()
                    .authenticated()
            .and()
            .oauth2Login();
    
  
    我请求https://url.com 被重定向到https://accounts.google.com/signin/oauth/ 经过身份验证后被重定向回 https://url.com/login/oauth2/code/google?state=state&code=code&scope=openid+email+profile+https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fuserinfo.email+https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fuserinfo.profile+https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fplus.me&authuser=0&session_state=session_state&prompt=none 超时错误:

[invalid_token_response] 尝试 检索 OAuth 2.0 访问令牌响应:POST 上的 I/O 错误 请求“https://www.googleapis.com/oauth2/v4/token”:连接 超时(连接超时);嵌套异常是 java.net.ConnectException:连接超时(连接超时)

此错误是由代理服务器设置或启动应用程序引起的吗?感谢您的帮助。

【问题讨论】:

显示你的反向代理配置。 【参考方案1】:

解决了。我必须设置 JVM 参数:

https.proxyHost=[host]
https.proxyPort=[port] 

http.proxyHost=[host]
http.proxyPort=[port]

【讨论】:

您的应用程序是否在主机上运行,​​主机有一些防火墙规则来禁止直接访问 Internet?为什么设置 JVM 代理参数有帮助?

以上是关于在反向代理后面使用 OAuth2 的 Spring Boot的主要内容,如果未能解决你的问题,请参考以下文章

您如何在代理后面使用 spring-security OAuth2,但仅将 ForwardedHeaderTransformer 用于 OAuth 组件

在反向代理后面使用 SP 时出现 Spring saml 问题

Spring Security Oauth2:无效的重定向 url

反向代理后面的 .NET 6 OAuth 身份验证:质询时重定向 url 错误

使用 Spring Cloud OAuth2 的 SSL / 代理问题

Webflux - Spring Boot - 具有 http 代理支持的 oAuth2 客户端