我用的是 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
在身份验证后创建用户。我以为我可以覆盖它并获得状态值,但我似乎不知道如何做到这一点。我还在想,也许有一个更简单的方法。你觉得呢?
1条答案
按热度按时间sdnqo3pr1#
这在默认情况下是不能做到的。看起来这个实现中的state参数只用于csrf,它并不打算用来传递自定义数据。
问题是,他们没有提供OAuth2AuthorizationCodeAuthenticationProvider类的自定义,其中在authenticate方法中比较请求和响应之间的状态。因此我们无法访问将响应返回到重定向URI的步骤。
我们需要在此实现中添加自定义OAuth2AuthorizationCodeAuthenticationProvider或从用户属性中获取状态。我们有例如nonce属性。我们也可以使用nonce来传递自定义数据,但默认情况下不能设置nonce。我们可以设置状态,但是我们不能在之后读取它。我们不能设置nonce,但是我们可以在之后读取它。在我们获得更新之前,它允许轻松访问状态参数,我们需要自定义实现,这当然是不推荐的。