通过 spring social 传递额外的查询/表单参数

Posted

技术标签:

【中文标题】通过 spring social 传递额外的查询/表单参数【英文标题】:Passing extra query/form parameters through spring social 【发布时间】:2018-09-27 12:59:02 【问题描述】:

我正在使用 JHipster 生成的 Spring Social 和 Spring Security 构建单页应用程序。

在某个社交身份验证提供商对用户进行身份验证后,我试图捕获原始查询参数。

例子:

调用 /signin/someprovider?show=someEntityId 并在成功的身份验证将用户重定向到 /signup/ 后,我需要一种获取“someEntityID”的方法。

我假设不同的 http 调用使得传递/存储参数变得困难。 是否有一些我可以使用/重用的 Spring 内置功能,或者如何解决这个问题?

更新

请求线程如下所示:

(1) 浏览器-> http://localhost:9060/signin/authenticationProvider?show=**someEntityId**

https://authenticationProvider... &state=SomeState

(2) 浏览器 -> https://authenticationProvider

http://localhost:9060/signin/google?state=SomeState&code=SomeCode

(3) 浏览器-> http://localhost:9060/signin/authenticationProvider?state=SomeState&code=SomeCode

http://localhost:9060/social/signup

(4) 浏览器 -> http://localhost:9060/social/signup

这最终在

 @GetMapping("/signup")
    public RedirectView signUp(WebRequest webRequest, @CookieValue(name = "NG_TRANSLATE_LANG_KEY", required = false, defaultValue = Constants.DEFAULT_LANGUAGE) String langKey) 
        try 
            Connection<?> connection = providerSignInUtils.getConnectionFromSession(webRequest);
            socialService.createSocialUser(connection, langKey.replace("\"", ""));

此时它要调用带有原始参数someEntityId的函数。

根据google oauth2 redirect_uri with several parameters,?show=someEntityId 参数应编码在 Oauth2 请求的 state 参数中才能生存 从(1)到(3)。在 (3) 中,必须将状态参数添加到重定向 uri,以便可以在 (4) 中解码原始参数。

看起来工作量很大,还是我遗漏了什么?如果有一种方法可以有一个会话变量,我可以将参数存储在 (1) 中并在 (4) 中再次获取它们,那就太好了。

【问题讨论】:

【参考方案1】:

由于版本 1.1.3 Spring Social 自己创建状态参数并将其用作 CSRF 令牌,请参阅 https://pivotal.io/security/cve-2015-5258 - 因此您可以(也不应该)在状态参数中编码其他参数。

相反,如果使用ProviderSignInController 启用提供程序符号,则可以使用ProviderSignInInterceptor 在会话中间存储此类参数(在preSignIn(...)postSignIn(...) 中)。

如果使用SocialAuthenticationFilter,我想会有类似的方法。

【讨论】:

以上是关于通过 spring social 传递额外的查询/表单参数的主要内容,如果未能解决你的问题,请参考以下文章

我可以将 Spring Social 与 Spring Security 一起使用吗?

为啥 Spring Social 插件偶尔会在 User 类上返回空邮件?

ReactJS + Spring Social (Facebook) + 身份验证后重定向回 React

如何通过在spring数据本机查询或存储库中传递userIds列表来获取用户的最大日期时间戳

另一台服务器上的 Spring Social Facebook URL 重定向

使用带有struts2的spring social