创建隐式JWT时的Spring Boot OAuth2?

Posted

技术标签:

【中文标题】创建隐式JWT时的Spring Boot OAuth2?【英文标题】:Spring Boot OAuth2 when implicit JWT is created? 【发布时间】:2018-12-22 00:18:37 【问题描述】:

如何从 OAuth2 SSO Principal 获取详细信息到我的 JWT? (OAuth2AuthenticationgetDetails 的实例为OAuth2AuthenticationDetailsgetDecodedDetails 返回null

我有……

Angular 6 客户端,隐式登录为 acme 客户端(使用 angular-oauth2-oidc

带有 JWT TokenService 配置的 Spring Boot OAuth2 授权服务器,带有第 3 方 SSO 到 GitHub

身份验证服务器配置为 acmeimplicit 和 SSO 的 GitHub 客户端

身份验证服务器公开/login/github 身份验证服务器公开/me(受ResourceServer 配置保护)

当我登录时...

    Angular 应用重定向到 Auth 服务登录 身份验证服务重定向到 GitHub [用户验证] GitHub 重定向到身份验证服务 Auth Service 启动会话并颁发令牌 身份验证服务重定向到 Angular 浏览器令牌是正确的 JWT

现在,当我与 Auth Service /me 通信时:

直接,我得到一个Principal,其中包含来自 GitHub 的所有详细信息(耶) 间接地从 Angular 应用程序通过 Authorization: Bearer ... 标头传递令牌,我得到一个 Principal,其中包含 acme 客户端的最低 OAuth 客户端信息(呃)

我尝试了自定义TokenEnhancer,但OAuth2Authentication 实例已经是最低限度的,没有详细信息。而且,当从 Angular 发起调用时,它没有与我直接调用时相同的会话 cookie(我不想共享会话 - 我想将详细信息放在 JWT 中)。

[更新 #1]

我尝试了一个自定义的JwtAccessTokenConverter,并在@EnableAuthorizationServer@EnableResourceServer(保护/me 端点)配置类中使用了它。然而它没有用。我仍然从OAuth2Authentication 获得空详细信息。

final JwtAccessTokenConverter converter = new JwtAccessTokenConverter();
converter.setAccessTokenConverter(new CustomTokenConverter());

【问题讨论】:

【参考方案1】:

Spring Lemon 这样做的方式是替换 OAuth2 和 OpenID 连接用户服务(请参阅spring security docs)。有关详细信息,请参阅 LemonOAuth2UserServiceLemonOidcUserService。对于无状态,它将客户端一个短暂的 JWT 令牌作为参数传递给 targetUrl,如您在其 OAuth2AuthenticationSuccessHandler 类中所见。它使用一些 cookie 机制来无状态地完成所有这些工作,可以通过查看其 HttpCookieOAuth2AuthorizationRequestRepository 及其配置方式来进一步理解。

这里有一篇文章更详细地解释了这一点:https://www.naturalprogrammer.com/blog/1681261/spring-security-5-oauth2-login-signup-stateless-restful-web-services。

【讨论】:

以上是关于创建隐式JWT时的Spring Boot OAuth2?的主要内容,如果未能解决你的问题,请参考以下文章

Spring Boot OAuth2 手动创建新的 JWT 令牌

如何使用spring boot jwt注销

Spring boot JWT Auth 详细信息为空

Spring/Boot - JWT 未在 GET 请求中获取

JWT 令牌的签名无效 - Azure + Spring Boot

1.创建spring-boot项目时的报错