2

我正在使用 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 , ?show= someEntityId参数应该在 Oauth2 请求的 state 参数中进行编码,以便从 (1) 到 (3) 存活。在 (3) 中,必须将状态参数添加到重定向 uri,以便可以在 (4) 中解码原始参数。

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

4

1 回答 1

0

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

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

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

于 2018-12-19T09:12:42.893 回答