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

Thi*_*ilo 7 nginx spring-security spring-boot spring-security-oauth2 spring-cloud

我改编了以下OAauth2 Spring Cloud示例:

Authserver/SSO

我做的唯一更改是在Authserver端使用JPA来检查数据库中的凭据.一切都运行良好,除了在nginx代理后面部署它.如上面的示例应用程序中所使用的,使用Spring Boot和嵌入式Tomcat.我还正确配置了代理头:

server.tomcat.protocol-header=X-Forwarded-Proto
server.tomcat.remote-ip-header=X-Real-IP
Run Code Online (Sandbox Code Playgroud)

代理HTTP正在运行:

accessTokenUri: http://uaa.sample.com/oauth/token
userAuthorizationUri: http://uaa.sample.com/oauth/authorize
Run Code Online (Sandbox Code Playgroud)

到目前为止一切顺利,但我需要使用SSL(显然):

accessTokenUri: https://uaa.sample.com/oauth/token
userAuthorizationUri: https://uaa.sample.com/oauth/authorize
Run Code Online (Sandbox Code Playgroud)

如果我切换到SSL,在auth服务器从授权重定向后,我从客户端应用程序获得401.我捕获了HTTP流量,一切似乎都有效:

HTTP和HTTPS的HTTP流量完全相同,只是对于HTTP,为最后一个请求设置了适当的引用(AFAIK,在OAuth身份验证期间未检查引用,对吧?):

HTTP:

GET /login?code=212eRK&state=9prwi2 HTTP/1.1
Host: test.sample.com
...
Referer: http://uaa.sample.com/login
Cookie: JSESSIONID=401EB8D1D1F4297160D518EC253A0CB5; XSRF-TOKEN=95a00a0d-3362-4e9b-b7eb-45addf2d10b4
...

---
HTTP/1.1 302 Found
Run Code Online (Sandbox Code Playgroud)

HTTPS:

GET /login?code=212eRK&state=9prwi2 HTTP/1.1
Host: test.sample.com
...
Cookie: JSESSIONID=401EB8D1D1F4297160D518EC253A0CB5; XSRF-TOKEN=95a00a0d-3362-4e9b-b7eb-45addf2d10b4
...

---
HTTP/1.1 401 Unauthorized
Run Code Online (Sandbox Code Playgroud)

客户端应用程序的相应日志消息:

Authentication request failed: org.springframework.security.authentication.BadCredentialsException: Could not obtain access token.
Run Code Online (Sandbox Code Playgroud)

使用代理和SSL的任何想法都不起作用?我很乐意分享更多代码和/或日志输出!

谢谢!!!

Jim*_*m.R 2

SSO 应用程序尝试将身份验证代码交换为令牌时似乎失败了。在此之前的所有步骤都是浏览器重定向,这是 SSO 服务器上尝试调用身份验证服务器的代码。您在身份验证服务器上使用什么 SSL 证书?它们是否由具有 Java 信任存储中的 CA 的受信任方签名?如果不是,这可能就是它失败的原因,因为 BadCredentialsException 是底层 HTTP 请求失败的最终结果。

另一种选择是没有从 SSO 服务器直接到 Auth 服务器地址的路由。

我相信最终是 Apache Commons HttpClient 代码将处理该请求,因此您应该尝试提高这些类 (org.apache.http) 的调试并查看它报告的内容。


归档时间:

查看次数:

3423 次

最近记录:

9 年,9 月 前