状态如何在Spring OAuth2中编码或加密?

时间:2016-05-22 20:26:42

标签: java spring spring-mvc spring-security spring-oauth2

与{160}中state令牌相关的_csrf参数的具体内容是什么? state_csrf的加密版本,因为我们会期待它吗?

此外,在将新的_csrf值封装到Spring OAuth2中的新state参数之前,应该使用哪种特定的Java语法对其进行编码和加密?


背景:

客户端应用程序将用户的Web浏览器从客户端应用程序重定向到授权服务器的authserver /登录页面。然后,在授权服务器应用程序中,OncePerRequestFilter的自定义实现用于将请求重定向到/oauth/authorize?(list of params)到其他身份验证步骤,这些步骤最终会重定向回/oauth/authorize?(list of params)的新请求。问题是 _csrf令牌在其他身份验证步骤the documentation indicates that _csrf is used as the state parameter期间发生了变化。这意味着授权服务器可能需要更新 state值以反映新的_csrf


如何state生成:

问题是客户端应用程序已经设置了state的编码和加密值,然后客户端应用程序使用OAuth2ClientAuthenticationProcessingFilter传输信息,以便在验证用户身份时使用身份验证服务器通过上述验证步骤。

某些研究表明,state密钥是由客户端使用DefaultStateKeyGenerator生成的,RandomValueStringGenrator又使用RandomValueStringGenerator生成6个字符的状态值。

例如,在向/oauth/authorize?(list of params)发出的原始请求中,原始_csrf值被编码为fupS1L ,如以下网址所示:< / p>

/oauth/authorize?client_id=acme&redirect_uri=http://localhost:8080/login&response_type=code&state=fupS1L

如果重定向流期间_csrf值更改为a69fd23a-a393-4b27-a685-a323fd31db9a,则state参数中fupS1L的值将不再有效,并且生成的令牌将不会被授权允许访问受保护的资源。

我将使用哪种特定语法将新_csrf值转换为类似于fupS1L的加密值,该值可以传递到功能state参数?< / strong>

此外,state变量和_csrf令牌之间是否存在任何关系? DefaultStateKeyGenerator使用的RandomValueStringGenerator似乎只是创建一个随机的6个字符串。我希望得到一位深深研究过代码甚至是编写代码的人的权威答案。我正在对代码进行深入审核,因此,阅读mysqli_connect源代码并说状态与csrf令牌无关的随意传递者不会添加任何值。然而,API的作者通过告诉我们它是如何工作的,将帮助我们所有人。


注意弹簧:
它不应该需要这么多的挖掘来找到这么简单的事情的文档。

1 个答案:

答案 0 :(得分:0)

我知道它被问到已经很老了。仍然共享我现在所知道的信息,因为我已经完成了类似的要求,以便在“状态”参数中传递深层链接。在成功的oauth登录会话后,当流从auth服务器返回时,我想重定向到此Deeplink。

我基本上遵循了这个SOF答案-> https://stackoverflow.com/a/52462787/5107365。这建议将DefaultStateKeyGenerator扩展为使用从请求到AAS的deeplink参数来加密+编码以设置为“ state”参数。并且,然后使用OAuth2ClientAuthenticationProcessingFilter.AuthenticationSuccessHandler的自定义实现来覆盖defineTargetUrl方法,以在成功通过身份验证后返回流时对状态参数进行解码/解密。希望它可以帮助需要类似要求的人。