我修改了以下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流量,一切似乎都可以正常工作:

对客户端应用程序的
  • 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?我很乐意分享更多代码和/或日志输出!

    谢谢!!!

    最佳答案

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

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

    我相信最终将由Apache Commons HttpClient代码处理请求,因此您应该尝试为这些类(org.apache.http)调试,并查看其报告。

    09-10 03:18
    查看更多