【发布时间】:2021-12-30 10:58:51
【问题描述】:
使用自定义重定向 URL 配置 Spring 安全性时,该 URL 使用此处记录的基本 URI 模板变量:https://docs.spring.io/spring-security/site/docs/5.2.12.RELEASE/reference/html/oauth2.html#oauth2Client-auth-code-redirect-uri
应用程序进入过多重定向的循环。
此配置有效: spring.security.oauth2.client.registration.okta.redirect-uri={baseUrl}/login/oauth2/code/{registrationId}
这不会: spring.security.oauth2.client.registration.okta.redirect-uri={baseScheme}://{baseHost}{basePort}{basePath}/login/oauth2/code/{registrationId}
由于证书和负载均衡器以及所有这些,我们需要欺骗 spring 重定向到运行它的 https 和 http。所以我们需要修改baseScheme。
使用基本 URL,从浏览器我们看到以下循环:
- 用户访问应用网址:https://MyApp
- 被重定向到 Okta 以使用与应用匹配的重定向 url 登录
- 使用来自 Okta 的代码重定向回应用程序
- 被重定向到他们正在寻找的 MyApp 中的页面
将redirect-url与baseScheme一起使用,循环是:
- 用户访问应用网址:https://MyApp
- 被重定向到 Okta 以使用与应用匹配的重定向 url 登录
- 使用来自 Okta 的代码重定向回应用程序
- 被重定向到 MyApp/oauth2/authorization/okta
- 被重定向到 Okta
- 使用来自 Okta 的不同代码重定向回应用程序
- 被重定向到 MyApp/oauth2/authorization/okta
- 被重定向到 Okta
- 使用来自 Okta 的不同代码重定向回应用程序
- 被重定向到 MyApp/oauth2/authorization/okta
- 直到它崩溃。
我们可能会错过什么设置?为什么 Spring 会转到 /oauth2/authorization/okta 而不是他们开始调用的原始页面?
注意:从 Okta 重定向回应用程序的说明:两个设置都是完全相同的重定向 URL: .../login/oauth2/code/okta?code=...
我的结论是:设置重定向 URL 会正确调用 Okta,但会影响应用程序如何响应重定向调用。
当调试打开时,这里是一个工作调用堆栈:
- 12二○二一年十一月一十九日:59:21.690 DEBUG 7400 --- [NIO-8080-EXEC-4] ossecurity.web.FilterChainProxy:固定GET /登录/的oauth2 /代码/ 1563码= Es23ULHG3psIXKE3fSk8vaiCITMiAKozHj4KU72n5K4&状态= 0w_8uffbbnhb5VNT31W4J2pvd1hE1f3_qSpOMA5_h7c %3D
- 2021-11-19 12:59:21.690 调试 7400 --- [nio-8080-exec-4] s.s.w.c.SecurityContextPersistenceFilter :将 SecurityContextHolder 设置为空 SecurityContext
- 2021-11-19 12:59:22.855 DEBUG 7400 --- [nio-8080-exec-4] .s.ChangeSessionIdAuthenticationStrategy:从 32A94CBEB8BB3474FC1FE355F283A3CD 更改了会话 ID
当它不工作时:
- 2021-11-19 12:55:37.359 调试 1240 --- [nio-8080-exec-5] ossecurity.web.FilterChainProxy:保护 GET /login/oauth2/code/okta?code=khASdiRxOdJk24dMALJDyfzlAWy-ilvAP_qlmTB0J8k&state =le1Ddql8ZXmajKD6XwbLi-c42k_-H6MfrlVhHi4Gyhw%3D
- 2021-11-19 12:55:37.359 调试 1240 --- [nio-8080-exec-5] s.s.w.c.SecurityContextPersistenceFilter :将 SecurityContextHolder 设置为空 SecurityContext
- 2021-11-19 12:55:37.359 调试 1240 --- [nio-8080-exec-5] os.s.w.a.AnonymousAuthenticationFilter :将 SecurityContextHolder 设置为匿名 SecurityContext
【问题讨论】:
-
之前好像出现过这个错误:stackoverflow.com/questions/32009738/…。但是那个问题OP没有说明错误的配置是什么。跟踪显示此错误:“HttpSessionRequestCache : Did not match request /login/oauth2/code/okta?co...”
-
挖掘更多,这实际上是“真正的”错误: OAuth2LoginAuthenticationFilter : Did not match request to Ant [pattern='{baseScheme}://{baseHost}{basePort}{basePath}/login/ oauth2/code/{registrationId}']
标签: java spring-security okta