无状态Spring JWT应用程序+ EnableOAuth2Client

时间:2018-07-21 13:18:55

标签: oauth-2.0 jwt jhipster spring-security-oauth2

我在解决这个问题上花了50多个小时,感谢您的投入。

我有一个使用Angular + Spring + JWT无状态身份验证(myApp)的JHipster 4.x生成的应用程序。我正在为一个经过身份验证的myApp用户连接一个第三方OAuth 2接口(battle.net),以使其与Battle.net进行OAuth交互,以便我们可以证明他们拥有Battle.net帐户并提取其Battle.net用户ID,从而可以将这些帐户链接到myApp。因此,JWT向南,OAuth2向北。

JWT正常工作,OAuth似乎正常工作。我之所以努力,是因为myApp使用无状态的JWT令牌,而Spring @ EnableOAuth2Client使用JSESSIONID,而且我似乎无法将两者结合在一起,因此我可以将Battle.net调用返回的数据关联到myApp Principal。 Battle.net在成功通过身份验证后使用回调URL,并且我可以在myApp PrincipalExtractor和myApp AuthenticationSuccessHandler中看到有效数据,但是由于没有提供JWT令牌,因此我无法将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的。是否可以通过@ EnableOAuth2Client将OAuth2规范根据回调返回的链接数据传递到Battle.net?我认为这可以解决我的问题。

spring-core-4.3.13 spring-boot-starter-security-1.5.9 春季安全核心-4.2.4 spring-security-oauth2-2.0.14

谢谢!

1 个答案:

答案 0 :(得分:1)

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

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