A 500点奖励提供。 Complete code以及如何快速重现问题的说明如下。
替换授权请求后的HttpSession为空
问题:
的
HttpSession
成为null
后的DefaultOAuth2RequestFactory
自定义实现替换当前AuthorizationRequest
使用保存AuthorizationRequest
。这将导致后续请求到
/oauth/token
的
失败,因为在/oauth/token
终点前的春季安全过滤器链的CsrfFilter无法找到session
Csrf token
在null
session
与比较request
的Csrf token
。
控制流在出错过程:
下面的流程图图示了其中步骤14和步骤15不知何故null
化的HttpSession
。 (或可能与JSESSIONID
不匹配。)CustomOAuth2RequestFactory.java
开始处的SYSO
步骤14显示确实存在实际上包含正确的CsrfToken
的HttpSession
。然而,在某种程度上,HttpSession
已变成null
步骤15触发从客户端localhost:8080/login
URL呼叫回到localhost:9999/oauth/token
端点。
将断点添加到以下调试日志中提到的HttpSessionSecurityContextRepository
的每一行中。 (它位于authserver
eclipse项目的Maven Dependencies
文件夹中。)这些断点确认的HttpSession
是null
当在下面的流程图中对/oauth/token
作出最终请求时。 (流程图的左下角)null
HttpSession
可能是由于在运行代码DefaultOAuth2RequestFactory
后浏览器中保留的JSESSIONID
过期而导致的。
在流程图中的步骤15结束之后,如何解决此问题,以便在最终呼叫端点/oauth/token
期间仍保留相同的HttpSession
?
相关代码和原木:
的CustomOAuth2RequestFactory.java
can be viewed at a file sharing site by clicking on this link.完整的代码我们可以猜测的是,null
session
是由于无论是1)在JSESSIONID
不被更新中浏览器由CustomOAuth2RequestFactory
中的代码或2.)HttpSession
实际上为null
通过。
为后步骤调用/oauth/token
春天开机调试日志15明确规定,没有HttpSession
通过这一点,可以如下:
2016-05-30 15:33:42.630 DEBUG 13897 --- [io-9999-exec-10] o.s.security.web.FilterChainProxy : /oauth/token at position 1 of 12 in additional filter chain; firing Filter: 'WebAsyncManagerIntegrationFilter'
2016-05-30 15:33:42.631 DEBUG 13897 --- [io-9999-exec-10] o.s.security.web.FilterChainProxy : /oauth/token at position 2 of 12 in additional filter chain; firing Filter: 'SecurityContextPersistenceFilter'
2016-05-30 15:33:42.631 DEBUG 13897 --- [io-9999-exec-10] w.c.HttpSessionSecurityContextRepository : No HttpSession currently exists
2016-05-30 15:33:42.631 DEBUG 13897 --- [io-9999-exec-10] w.c.HttpSessionSecurityContextRepository : No SecurityContext was available from the HttpSession: null. A new one will be created.
2016-05-30 15:33:42.631 DEBUG 13897 --- [io-9999-exec-10] o.s.security.web.FilterChainProxy : /oauth/token at position 3 of 12 in additional filter chain; firing Filter: 'HeaderWriterFilter'
2016-05-30 15:33:42.631 DEBUG 13897 --- [io-9999-exec-10] o.s.s.w.header.writers.HstsHeaderWriter : Not injecting HSTS header since it did not match the requestMatcher org.springframework.se[email protected]2fe29f4b
2016-05-30 15:33:42.631 DEBUG 13897 --- [io-9999-exec-10] o.s.security.web.FilterChainProxy : /oauth/token at position 4 of 12 in additional filter chain; firing Filter: 'CsrfFilter'
2016-05-30 15:33:42.644 DEBUG 13897 --- [io-9999-exec-10] o.s.security.web.csrf.CsrfFilter : Invalid CSRF token found for http://localhost:9999/uaa/oauth/token
2016-05-30 15:33:42.644 DEBUG 13897 --- [io-9999-exec-10] w.c.HttpSessionSecurityContextRepository : SecurityContext is empty or contents are anonymous - context will not be stored in HttpSession.
2016-05-30 15:33:42.644 DEBUG 13897 --- [io-9999-exec-10] s.s.w.c.SecurityContextPersistenceFilter : SecurityContextHolder now cleared, as request processing completed
重新创建您电脑上的问题:
您可以在几分钟内通过以下简单的步骤重新创建任何计算机上的问题ps:
1.)下载zipped version of the app from a file sharing site by clicking on this link。
2.)通过打字解压应用程式:tar -zxvf oauth2.tar(4).gz
3.)通过导航到oauth2/authserver
然后键入mvn spring-boot:run
启动authserver
应用程序。
4.)通过导航到oauth2/resource
,然后键入mvn spring-boot:run
5.)通过导航到oauth2/ui
,然后键入mvn spring-boot:run
6.)打开网页浏览器并启动ui
应用启动resource
应用导航到http : // localhost : 8080
7.)单击Login
,然后输入Frodo
作为用户,并输入MyRing
作为密码,然后单击提交。
8.)输入5309
作为Pin Code
,然后单击提交。 这将触发上面显示的错误。
春季启动调试日志将显示的SYSO
很多,其给出的变量,如XSRF-TOKEN
和HttpSession
在该流程图中所示的各步骤的值。 SYSO
帮助细分调试日志,以便更易于解释。所有SYSO
由其他类调用的一个类完成,因此您可以操作SYSO
生成的类来更改控制流中的任何地方的报告。 SYSO
生成类的名称是TestHTTP
,其源代码可以在相同的demo
包中找到。
使用调试器:
1.)选择正在运行的应用程序authserver
的终端窗口并输入Ctrl-C
停止authserver
应用程式。
2.)导入三个应用程序(authserver
,resource
和ui
)到Eclipse作为现有行家项目。
3。)在authserver
应用程序的Eclipse项目资源管理器,单击展开Maven Dependencies
文件夹,然后在它向下滚动到单击展开Spring-Security-web...
罐子如以橙色显示圆圈中的形象。然后滚动查找并展开org.springframework.security.web.context
包。然后双击打开下面屏幕截图中以蓝色突出显示的HttpSessionSecurityContextRepository
类。为此类中的每一行添加断点。您可能想要在同一个包中对SecurityContextPersistenceFilter
类执行相同的操作。 这些断点将使您能够看到在控制流程结束之前当前变为null
的HttpSession
的值,但需要有一个可以映射到XSRF-TOKEN
的有效值才能解决此OP。
4)在应用程序中的demo
包,里面CustomOAuth2RequestFactory.java
添加断点。然后Debug As... Spring Boot App
启动调试器。
5.)然后重复上面的步骤6到8。您可能希望在每次尝试之前清除浏览器的缓存。您可能需要打开浏览器开发人员工具的“网络”选项卡。
非常感谢你。你解决了这个问题。我将此标记为接受的答案。我希望我们的时间安排能够让您在给出答案时仍然可以获得赏金,因为您的答案是解决问题的真正方法。欢迎来到堆栈溢出。 – CodeMed
这是一个双赢的过程,因为我需要一个完整的样本和清晰的概念图表来为我的团队合作。非常感谢你的贡献,节省了我创建自己的时间。您的项目是我可以在社区中找到的唯一完成的源。 –
这个小小的改变也可以解决你的另一个问题。 http://stackoverflow.com/questions/37061697/invalid-xsrf-token-at-oauth-token –