当应用程序位于SSL终止代理之后时,如何配置Spring Boot以使用OIDC

当应用程序位于SSL终止代理之后时,如何配置Spring Boot以使用OIDC,spring,spring-boot,spring-security,openid-connect,Spring,Spring Boot,Spring Security,Openid Connect,我正在尝试将Spring引导应用程序配置为使用OIDC。服务器位于SSL终止代理之后 以下是我使用的属性: spring: security: oauth2: client: provider: oidc: authorization-uri: https://example.org/oidc/oauth2/authorize token-uri: https://example.org/

我正在尝试将Spring引导应用程序配置为使用OIDC。服务器位于SSL终止代理之后

以下是我使用的属性:

spring:
  security:
    oauth2:
      client:
        provider:
          oidc:
            authorization-uri: https://example.org/oidc/oauth2/authorize
            token-uri: https://example.org/oidc/oauth2/access_token
            user-info-uri: https://example.org/oidc/oauth2/userinfo
            jwk-set-uri: https://example.org/oidc/oauth2/connect/jwk_uri
            custom-params: param_name1,param_value1,param_name2,param_value2,nonce,123456789
        registration:
          oidc:
            client-id: myclientid
            client-secret: myclientsecret
            authorization-grant-type: authorization_code
            scope:
              - openid
              - email
              - profile
            redirect-uri: https://mydomain/myapp/login/oauth2/code/oidc
这里是错误的地方:

1。OIDC服务器要求将nonce参数添加到请求URL中

我通过使用自定义OAuth2AuthorizationRequest解决了这个问题,该请求读取自定义params属性并将这些值附加到请求URL

2。OidcAuthorizationCodeAuthenticationProvider引发由无效的\u redirect\u uri\u参数引起的异常

我尝试了很多方法来解决这个问题

我尝试创建一个过滤器,将X-Forwarded-Proto添加到请求中(因为代理无法处理该问题)

添加了标题,我还添加了以下属性:

server:
    forward-headers-strategy: native
    tomcat.protocol-header: x-forwarded-proto
但它似乎不起作用

OidcAuthorizationCodeAuthenticationProvider仍引发异常,因为此条件为false:

!authorizationResponse.getRedirectUri().equals(authorizationRequest.getRedirectUri())
我已经调试了代码,唯一的区别是一个是http,另一个是https

我发现了一个我一点也不喜欢的非常粗糙的解决方案,它是另一个过滤器,只为那个特定的URL修改URL

我想要一个更优雅的解决方案

3。使用自定义nonce参数时,OidcAuthorizationCodeAuthenticationProvider抛出一个由无效nonce引起的异常

现在我被卡住了。我曾考虑编写自己的身份验证提供程序,但我不能保证我的身份验证提供程序会在Spring提供的OIDC身份验证提供程序之前获得

现在,这是第22条:

  • 如果我不使用自定义参数,我就找不到让Spring将nonce添加到请求中的方法

  • 如果我用那个,当它是JWT的一部分时,Spring不会识别它,并且会发疯

非常感谢您的帮助,因为这已经让我发疯好几天了,如果不是几周的话。

多谢各位

编辑

案例2中比较的两个URL来自:

  • OAuth2AuthorizationRequest
  • OAuth2AuthorizationResponse
OAuth2AuthorizationRequest内置于 OAuth2AuthorizationRequestRedirectFilter位于以下行:

OAuth2AuthorizationRequest authorizationRequest = this.authorizationRequestResolver.resolve(request);
重定向uri内置于DefaultOAuth2AuthorizationRequestResolver.expandRedirectUri()中,它调用

UriComponentsBuilder.fromHttpUrl(UrlUtils.buildFullRequestUrl(request))
OAuth2AuthorizationResponse内置于OAuth2LoginAuthenticationFilter.attemptAuthentication()中,它还调用

UriComponentsBuilder.fromHttpUrl(UrlUtils.buildFullRequestUrl(request))
然后

OAuth2AuthorizationResponseUtils.convert(params, redirectUri)
我会仔细检查,但我不记得在构建这些URL时调用了UriComponentsBuilder.AdapteFromForwardedHeaders(HttpHeaders headers)


即使这样做行得通,仍然会留下暂时的问题:(

我们偶然发现了同样的问题,问题主要是因为我们的服务器使用了反向代理,而代理似乎以某种方式更改了url,导致检查失败

!authorizationResponse.getRedirectUri().equals(authorizationRequest.getRedirectUri())
这一行在提交时在spring security的更高版本中被删除

24500fa3ca23aa23ede86dfcfe02113671d5b8bc

它于2019年12月6日推出,并在春季安全版本5.1.13中发布

因此,解决方案是将SpringBoot升级到至少2.1.17,以获得SpringBoot2.1.X版本

虽然OP说他不能升级他的图书馆,但我希望这能帮助那些可以升级的人

我们还完成了Kavithakaran Kanapathipilla提到的解决方案,并将反向代理配置为添加X-forwarded-proto http头,我相信我们还配置了spring boot application.properties来检查它们


当您说
x-forwarded-proto
不起作用时,您是否验证了您的代理正在发送该标头?如果您验证了代理正在发送该标头,您是否可以将
x
大写(我知道标头名称不区分大小写,但
adaptedfromforwardedheaders
使用
x
以防万一)您可以在
org.springframework.web.util.UriComponentsBuilder.AdapteFromForwardedHeaders(HttpHeaders)中放置断点
method,因为它似乎是提取重定向的方法uri@KavithakaranKanapathippillai标题设置为X-Forwarded-Proto。请查看我编辑的有关重定向url的帖子。当你说X-Forwarded-Proto无效时,你是否验证了你的代理正在发送该标题?我找不到此问题的答案。
,因为代理不能处理这个问题。
你的意思是代理没有添加头吗?代理没有发送头,这就是为什么我创建了一个过滤器来添加头。显然,它在另一个项目中工作,但该项目没有使用Spring Boot和最新的Spring Security,并且它正在手动处理OIDC身份验证。