首页 > 解决方案 > 无状态 Spring JWT 应用程序 + EnableOAuth2Client

问题描述

我在这个解决方案上已经深入了 50 多个小时,希望能提供任何意见。

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

JWT 工作正常,OAuth 似乎工作正常。我正在苦苦挣扎,因为 myApp 使用无状态 JWT 令牌,而 Spring @EnableOAuth2Client 使用 JSESSIONID,而且我似乎无法将两者结合在一起,因此我可以将从战网调用返回的数据与 myApp 主体相关联。Battle.net 在成功验证后使用回调 URL,我可以在 myApp PrincipalExtractor 和 myApp AuthenticationSuccessHandler 中看到有效数据,但是由于没有提供 JWT 令牌,我无法将 Battle.net 数据链接到 myApp用户。

** 用户发起 OAuth **

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

**战网回调成功**

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

我看到 '&redirectUri=xxx&response_type=yyy&code=xxx' 在 '/oauth/authorize' 请求中被传递给了战网。有没有办法通过@EnableOAuth2Client 将链接数据传递到根据OAuth2 规范在回调中返回的battle.net?我认为这会解决我的问题。

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

谢谢!

标签: oauth-2.0jwtjhipsterspring-security-oauth2

解决方案


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

@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);
    }
}

推荐阅读