创建隐式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? (OAuth2Authentication
getDetails
的实例为OAuth2AuthenticationDetails
getDecodedDetails
返回null
)
我有……
Angular 6 客户端,隐式登录为acme
客户端(使用 angular-oauth2-oidc
)
带有 JWT TokenService
配置的 Spring Boot OAuth2 授权服务器,带有第 3 方 SSO 到 GitHub
身份验证服务器配置为 acme
为 implicit
和 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)。有关详细信息,请参阅 LemonOAuth2UserService
和 LemonOidcUserService
。对于无状态,它将客户端一个短暂的 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 未在 GET 请求中获取