无状态 Spring JWT 应用程序 + EnableOAuth2Client

Stateless Spring JWT Application + EnableOAuth2Client

我在这个解决方案上花费了 50 多个小时,非常感谢任何意见。

我有一个 JHipster 4.x 使用 Angular + Spring + JWT 无状态身份验证 (myApp) 生成的应用程序。我正在为经过身份验证的 myApp 用户连接第 3 方 OAuth 2 接口(battle.net)以针对 battle.net 进行 OAuth,因此我们可以证明他们拥有 battle.net 帐户并提取他们的 battle.net用户 ID,因此帐户在 myApp 中 linked。所以 JWT 南向,OAuth2 北向。

JWT 工作正常,OAuth 似乎工作正常。我很挣扎,因为 myApp 使用无状态 JWT 令牌,而 Spring @EnableOAuth2Client 使用 JSESSIONID,我似乎无法将两者结合在一起,因此我可以将 battle.net 调用返回的数据关联到 myApp Principal . battle.net 在成功验证后使用回调 URL,我可以在 myApp PrincipalExtractor 和 myApp AuthenticationSuccessHandler 中看到有效数据,但由于没有提供 JWT 令牌,我无法 link battle.net 数据给 myApp 用户。

** 用户启动 OAuth **

用户 -- JWT --> myApp /login/battlenet --> battle.net /oauth/*

** battle.net回调成功**

battle.net --> myApp /callback/battlenet - 这是很好的战网数据,但没有 JWT 令牌,所以 Principal 是匿名用户。

我看到“&redirectUri=xxx&response_type=yyy&code=xxx”在“/oauth/authorize”请求中被传递给 battle.net。有没有办法将 linking 数据传递给 battle.net,根据 OAuth2 规范使用 @EnableOAuth2Client 在回调中返回?我想这会解决我的问题。

spring-core-4.3.13 spring-boot-starter-security-1.5.9 spring-security-core-4.2.4 spring-security-oauth2-2.0.14

谢谢!

我找到了一种传递链接数据的方法。我希望它能帮助别人。 :)

@Bean
public OAuth2ClientContextFilter oauth2ClientContextFilter() {
    OAuth2ClientContextFilter oauth2ClientContextFilter = new OAuth2ClientContextFilter();
    oauth2ClientContextFilter.setRedirectStrategy(new BMAOAuthRedirectStrategy());
    return oauth2ClientContextFilter;
}

class BMAOAuthRedirectStrategy extends DefaultRedirectStrategy {
    @Override
    public void sendRedirect(HttpServletRequest request, HttpServletResponse response, String url) throws IOException {
        url = url.concat("&bma_uuid=MY_LINKING_DATA");
        String redirectUrl = calculateRedirectUrl(request.getContextPath(), url);
        redirectUrl = response.encodeRedirectURL(redirectUrl);
        if (logger.isDebugEnabled()) {
            logger.debug("Custom BMA SecurityConfiguration Redirecting to '" + redirectUrl + "'");
        }
        response.sendRedirect(redirectUrl);
    }
}