【发布时间】:2015-07-21 18:30:39
【问题描述】:
我改编了以下 OAauth2 Spring Cloud 示例:
我所做的唯一更改是在 Authserver 端使用 JPA 来检查数据库中的凭据。一切正常,除了将它部署在 nginx 代理后面。如上面示例应用程序中使用的那样,使用了 Spring Boot 和嵌入式 Tomcat。我还正确配置了代理标头:
server.tomcat.protocol-header=X-Forwarded-Proto
server.tomcat.remote-ip-header=X-Real-IP
代理 HTTP 工作正常:
accessTokenUri: http://uaa.sample.com/oauth/token
userAuthorizationUri: http://uaa.sample.com/oauth/authorize
到目前为止一切顺利,但我需要使用 SSL(显然):
accessTokenUri: https://uaa.sample.com/oauth/token
userAuthorizationUri: https://uaa.sample.com/oauth/authorize
如果我切换到 SSL,在身份验证服务器从授权重定向回来后,我会从客户端应用程序收到 401。我捕获了 HTTP 流量,一切似乎都正常:
- 对客户端应用程序的 GET 请求
- 客户端应用重定向到 /login
- /login 重定向到https://uaa.sample.com/oauth/authorize?client_id=reprisk&redirect_uri=http://test.sample.com/login&response_type=code&state=9prwi2
- 身份验证服务器重定向到https://uaa.sample.com/login
- 登录后再次调用authorize,服务器最终重定向到http://test.sample.com/login?code=212eRK&state=9prwi2
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
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
来自客户端应用程序的相应日志消息:
Authentication request failed: org.springframework.security.authentication.BadCredentialsException: Could not obtain access token.
任何想法为什么使用代理和 SSL 不起作用?我很高兴分享更多代码和/或日志输出!
谢谢!!!
【问题讨论】:
-
日志可能会告诉你(
org.springframework.security的调试日志记录)。 -
@DaveSyer 我也有同样的问题。调整日志级别并没有显示有关可能根本原因的更多信息
-
我无法从这种详细程度中分辨出更多信息。一个示例应用程序会很有帮助。
-
刚刚花了一些时间在我的调试器中运行似乎类似的情况。在我的例子中,在抛出 BadCredentialsException 的时候,底层的链式异常是一个 InvalidRequestException,带有消息:检测到可能的 CSRF:需要状态参数,但找不到。 BadCredentialsException 有点误导我天真的(csrf 很重要)的想法。
-
我在尝试获取网络代理后面的 oauth(uaa/oauth/token) 令牌时遇到示例错误。
标签: nginx spring-security spring-boot spring-security-oauth2 spring-cloud