我在这个解决方案上花费了 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,而且我似乎无法将两者结合在一起,因此我可以将从 Battle.net 调用返回的数据关联到 myApp 主体。 Battle.net 在成功身份验证后使用回调 URL,我可以在 myApp PrimaryExtractor 和 myApp AuthenticationSuccessHandler 中看到有效数据,但由于没有提供 JWT 令牌,我无法将 Battle.net 数据链接到 myApp用户。
** 用户启动 OAuth **
用户 -- JWT --> myApp /login/battlenet --> Battle.net /oauth/*
**战网回调成功**
Battle.net --> myApp /callback/battlenet - 这是很好的战网数据,但没有 JWT 令牌,因此主体是匿名用户。
我看到“&redirectUri=xxx&response_type=yyy&code=xxx”在“/oauth/authorize”请求上被传递到 Battle.net。有没有办法将链接数据传递到 Battle.net,该数据是根据 OAuth2 规范使用 @EnableOAuth2Client 在回调中返回的?我认为这会解决我的问题。
弹簧芯-4.3.13
spring-boot-starter-security-1.5.9
弹簧安全核心-4.2.4
弹簧安全-oauth2-2.0.14
Thanks!
我找到了一种传递链接数据的方法。我希望它对其他人有帮助。 :)
@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);
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)