6

Spring OAuth2 中与令牌state相关的参数具体如何?_csrf 是我们期望state的加密版本吗?_csrf

_csrf此外,在将新值封装到stateSpring OAuth2 中的新参数之前,应该使用什么特定的 Java 语法来编码和加密它?


**上下文:**

客户端应用程序将用户的 Web 浏览器从客户端应用程序重定向到授权服务器的 authserver/login 页面。然后,在授权服务器应用程序中,使用 的自定义实现OncePerRequestFilter将请求重定向/oauth/authorize?(list of params)到其他身份验证步骤,最终重定向回新请求到/oauth/authorize?(list of params). 问题是令牌在额外的身份验证步骤期间发生了变化_csrf并且文档表明它_csrf被用作state参数。这意味着授权服务器可能需要更新该值以反映新值state_csrf


**如何生成“状态”:**
问题在于,在客户端应用程序使用“OAuth2ClientAuthenticationProcessingFilter ”传输信息以供身份验证服务器在通过上述身份验证步骤对用户进行身份验证时使用 之前,客户端应用程序已经设置了“状态”的编码和加密值。一些研究表明,`state` 键是由客户端使用`DefaultStateKeyGenerator`生成的,而后者又使用`RandomValueStringGenrator`生成 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

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

为了将新_csrf值转换为类似于fupS1L可以传递给功能state参数的加密值,我使用什么特定语法?

state另外,变量和_csrf令牌之间有什么关系吗?使用的RandomValueStringGeneratorbyDefaultStateKeyGenerator似乎只是创建了一个随机的 6 个字符的字符串。我希望深入研究代码甚至编写代码的人给出权威的答案。我正在对代码进行深入审查,因此阅读RandomValueStringGenerator源代码并说状态与csrf令牌无关的偶然路人不会增加任何价值。然而,API 的作者会告诉我们它是如何工作的,从而为我们提供了很多帮助。


**注意春天:**
它不应该需要这么多的挖掘来找到这样一个简单事物的文档。
4

1 回答 1

0

我知道它已经很老了,因为它被问到了。仍然分享我现在所知道的,因为我已经通过类似的要求在“状态”参数中传递深度链接。在成功的 oauth 登录会话后,当流从 auth-server 返回时,我想重定向到此深层链接。

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

于 2019-09-20T15:46:34.430 回答