我修改了以下OAauth2 Spring Cloud示例:
Authserver/SSO
我所做的唯一更改是在Authserver端使用JPA来检查数据库中的凭据。除了将其部署在nginx代理之后之外,其他一切都运行良好。如上面的示例应用程序中所使用的,使用了Spring Boot和嵌入式Tomcat。我还正确配置了代理 header :
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流量,一切似乎都可以正常工作:
对客户端应用程序的
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?我很乐意分享更多代码和/或日志输出!
谢谢!!!
最佳答案
SSO应用尝试将身份验证代码交换为 token 的地方似乎失败了。
之前的所有步骤都是浏览器重定向,这是SSO服务器上尝试调用身份验证服务器的代码。
您在身份验证服务器上使用什么SSL证书?它们是否由Java信任库中具有CA的受信任方签名?
如果不是,那可能就是它失败的原因,因为BadCredentialsException是基础HTTP请求失败的最终结果。
另一个选择是没有直接从SSO服务器到Auth服务器地址的路由。
我相信最终将由Apache Commons HttpClient代码处理请求,因此您应该尝试为这些类(org.apache.http)调试,并查看其报告。