oauth-2.0 - 无状态 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
谢谢!
解决方案
我找到了一种传递链接数据的方法。我希望它可以帮助别人。:)
@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);
}
}
推荐阅读
- python - 如何在 Pandas DataFrame 中跳过列标题行
- rstudio - 将 csv 文件加载到 Rstudio 中的 Spark DataFrame 时发生错误
- python-3.x - 在 for 循环 Python 中结束
- flutter - 在 Flutter webview 中拦截 AJAX 适用于 iOS 但不适用于 Android
- clojure - 如何在 deps.edn 项目中使用 cljsjs 包
- javascript - 是否可以通过免费帐户使用 firebase 进行网络抓取?
- sql-server - TSql 前面的反斜杠更改列值
- linux - 仅当行不存在时,如何将一行添加到不同子目录下的多个文本文件?
- arrays - 如何将数组值存储在 Postman 的环境变量中
- python - 使用 Bokeh 绘图时如何为多个数据集之一添加悬停工具