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

标签 nginx spring-security spring-boot spring-security-oauth2 spring-cloud

我改编了以下 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) 进行调试并查看它报告的内容。

    关于nginx - 使用 Spring Cloud OAuth2 的 SSL/代理问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30164516/

    相关文章:

    java - Spring 安全: deserialize request body twice (oauth2 processing)

    java - 如何在 PCF 中运行的 Spring Boot 应用程序中加载更改的环境变量而不重新启动应用程序?

    java - 过滤器在注册为 Spring bean 时调用两次

    java - 如何在 Spring Boot 中使用 testng 测试数据库调用

    Spring 拦截器与@RepositoryRestResource 不兼容

    在 3XX 重定向的情况下不执行 Nginx access_by_lua_block

    macos - Mac 上的 Docker 测试版 : Cannot use ip to access nginx container

    PHP 和 Django : Nginx, FastCGI 和 Green Unicorn?

    redirect - nginx.conf 重定向多个条件

    java - spring security中如何获取所有LDAP组