Cod*_*Med 6 java spring spring-mvc spring-security spring-oauth2
Spring OAuth2 中state与_csrf令牌相关的参数具体如何? 是我们期望state的加密版本_csrf吗?
另外,_csrf在将新值封装到stateSpring OAuth2 中的新参数之前,应该使用什么特定的 Java 语法对新值进行编码和加密?
客户端应用程序将用户的 Web 浏览器从客户端应用程序重定向到授权服务器的 authserver/登录页面。然后,在授权服务器应用程序中,使用 的自定义实现OncePerRequestFilter将请求重定向/oauth/authorize?(list of params)到其他身份验证步骤,最终重定向回新请求到/oauth/authorize?(list of params)。的问题是,在_csrf过程中的附加认证步骤令牌变化,并且所述文档表示_csrf被用作state参数。这意味着该state值可能需要由授权服务器更新以反映新_csrf值。
state:问题在于,在state客户端应用程序使用 aOAuth2ClientAuthenticationProcessingFilter传输信息以供身份验证服务器使用之前,客户端应用程序已经设置了的编码和加密值,同时通过上述身份验证步骤对用户进行身份验证。
一些研究表明,state密钥是由客户端使用 a 生成的,而客户端DefaultStateKeyGenerator又使用 aRandomValueStringGenrator生成一个 6 个字符的状态值。
例如,在对 的原始请求中/oauth/authorize?(list of params),原始_csrf值被编码为fupS1L,如下面的 url 所示:
/oauth/authorize?client_id=acme&redirect_uri=http://localhost:8080/login&response_type=code&state=fupS1L
Run Code Online (Sandbox Code Playgroud)
如果在重定向流期间_csrf值更改为,则 state 参数中a69fd23a-a393-4b27-a685-a323fd31db9a的值fupS1L将不再有效,并且生成的令牌将不会被授权允许访问受保护的资源。
我使用什么特定语法来将新_csrf值转换为类似于fupS1L可以传递给功能state参数的加密值?
另外,state变量和_csrf令牌之间有什么关系吗?在RandomValueStringGenerator通过使用DefaultStateKeyGenerator似乎简单地创建一个随机的6字符串。我想要一个深入研究代码甚至编写代码的人的权威答案。我正在对代码进行深入审查,因此阅读RandomValueStringGenerator源代码并说状态与csrf令牌无关的临时路人不会添加任何值。然而,API 的作者会告诉我们它是如何工作的,从而对我们大有帮助。
我知道自从被问到以来它已经很老了。仍然分享我现在所知道的,因为我已经完成了类似的要求,以在“状态”参数中传递深层链接。在成功的 oauth 登录会话后,当流量从身份验证服务器返回时,我想重定向到此深层链接。
我主要遵循这个 SOF 答案 -> /sf/answers/3672395121/。这建议扩展 DefaultStateKeyGenerator 以使用 AAS 请求中的深层链接参数来加密+编码以设置为“状态”参数。并且,然后使用 OAuth2ClientAuthenticationProcessingFilter.AuthenticationSuccessHandler 的自定义实现来重写确定TargetUrl 方法,以在身份验证成功后返回流程时对状态参数进行解码和解密。希望它能帮助有类似需求的人。
| 归档时间: |
|
| 查看次数: |
1471 次 |
| 最近记录: |