通过 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列表来获取用户的最大日期时间戳