如何在spring Boot 中从oauth响应中检索“state”参数

kgsdhlau  于 2023-03-22  发布在  Spring
关注(0)|答案(1)|浏览(151)

我用的是 Spring Boot ,特别是spring-boot-starter-oauth2-client依赖于谷歌登录。一切都工作正常,除了我需要在请求中发送一些细节,然后从响应中检索它们,以便我可以使用这些细节。我做了一些研究,发现我可以通过在发送Oauth请求时使用state参数来做到这一点。我可以成功地设置“state”我的自定义OAuth2 AuthorizationRequestResolver中的值如下:

private OAuth2AuthorizationRequest customizeAuthorizationRequest(OAuth2AuthorizationRequest req,
            HttpServletRequest request) {
        String state = Base64.getEncoder().encodeToString("test".getBytes());
        return OAuth2AuthorizationRequest.from(req).state(state).build();

    }

这一切都很好!但是,我不知道如何从响应中检索这个值。我可以看到OidcAuthorizationCodeAuthenticationProvider.java在身份验证后创建用户。我以为我可以覆盖它并获得状态值,但我似乎不知道如何做到这一点。我还在想,也许有一个更简单的方法。你觉得呢?

sdnqo3pr

sdnqo3pr1#

这在默认情况下是不能做到的。看起来这个实现中的state参数只用于csrf,它并不打算用来传递自定义数据。
问题是,他们没有提供OAuth2AuthorizationCodeAuthenticationProvider类的自定义,其中在authenticate方法中比较请求和响应之间的状态。因此我们无法访问将响应返回到重定向URI的步骤。
我们需要在此实现中添加自定义OAuth2AuthorizationCodeAuthenticationProvider或从用户属性中获取状态。我们有例如nonce属性。我们也可以使用nonce来传递自定义数据,但默认情况下不能设置nonce。我们可以设置状态,但是我们不能在之后读取它。我们不能设置nonce,但是我们可以在之后读取它。在我们获得更新之前,它允许轻松访问状态参数,我们需要自定义实现,这当然是不推荐的。

相关问题