无状态Spring JWT应用程序+EnableOAuth2Client



我已经花了50多个小时研究这个解决方案,如果有任何意见,我将不胜感激。

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

JWT运行良好,OAuth似乎运行良好。我很挣扎,因为myApp使用无状态JWT令牌,而Spring@EnableOAuth2Client使用JSESSIONID,而且我似乎无法将两者结合起来,以便将战网调用返回的数据关联到myApp Principal。战网在成功身份验证后使用回调URL,我可以在myApp PrincipalExtractor和myApp AuthenticationSuccessHandler中看到有效数据,但由于没有提供JWT令牌,我无法将战网数据链接到myApp用户。

**用户启动OAuth**

用户--JWT-->myApp/login/bracknet-->战网/oauth/*

**战网回调成功**

battle.net-->myApp/recallback/bracknet-这是很好的战网数据,但没有JWT令牌,因此Principal是匿名用户。

我看到了'&redirectUri=xxx&response_type=yyy&code=xxx'在"/oauth/authorize"请求中被传递到战网。有没有一种方法可以将链接数据传递到battle.net,并通过@EnableOAuth2Client根据OAuth2规范在回调时返回?我想那会解决我的问题。

弹簧芯-4.3.13春季启动安全-1.5.9弹簧安全核心-4.2.4春季安全认证2-20.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);
}
}

最新更新