Spring 在创建隐式 JWT 时启动 OAuth2?
Spring Boot OAuth2 when implicit JWT is created?
如何从 OAuth2 SSO Principal
获取详细信息到我的 JWT? (OAuth2Authentication
getDetails
的实例为 OAuth2AuthenticationDetails
getDecodedDetails
returns null
)
我有...
- Angular 6 客户端 w/ 作为
acme
客户端隐式登录(使用 angular-oauth2-oidc
)
Spring 使用 JWT TokenService
配置和第 3 方 SSO 到 GitHub
启动 OAuth2 授权服务器
Auth 服务器配置 acme
作为 implicit
和 GitHub 客户端用于 SSO
- Auth 服务器暴露了一个
/login/github
- Auth 服务器公开一个
/me
(受 ResourceServer 配置保护)
当我登录时...
- Angular 应用程序重定向到 Auth 服务登录
- 授权服务重定向到 GitHub
- [用户验证]
- GitHub 重定向到 Auth 服务
- Auth 服务启动 session 并颁发令牌
- Auth 服务重定向到 Angular
- 浏览器令牌是正确的 JWT
现在,当我与 Auth Service 通信时 /me
:
- 我直接得到一个
Principal
,其中包含 GitHub 的所有详细信息(耶)
- 间接从 Angular 应用程序通过
Authorization: Bearer ...
header 传递令牌,我得到一个 Principal
,其中包含 acme
的最低限度 OAuth 客户端信息客户(呃)
我试过自定义 TokenEnhancer
,但 OAuth2Authentication
实例已经是最低限度的,没有任何细节。而且,当调用从 Angular 发起时,它没有与我直接调用它时相同的 session cookie(我不想共享 session - 我想将详细信息放在 JWT 中)。
[更新 #1]
我尝试了自定义 JwtAccessTokenConverter
并在 @EnableAuthorizationServer
和 @EnableResourceServer
(保护 /me
端点)配置中使用了它 类。但是它没有用。我仍然从 OAuth2Authentication
.
获得空详细信息
final JwtAccessTokenConverter converter = new JwtAccessTokenConverter();
converter.setAccessTokenConverter(new CustomTokenConverter());
方式Spring Lemon does this is replacing the OAuth2 and OpenID connect user services (see spring security docs)。有关详细信息,请参阅 LemonOAuth2UserService
和 LemonOidcUserService
。对于无状态,它将客户端一个短暂的 JWT 令牌作为参数传递给 targetUrl,如您在其 OAuth2AuthenticationSuccessHandler
class 中所见。它使用一些 cookie 机制来无状态地执行所有这些操作,可以通过查看它的 HttpCookieOAuth2AuthorizationRequestRepository
及其配置方式来进一步理解。
这里有一篇文章对此进行了更详细的解释:https://www.naturalprogrammer.com/blog/1681261/spring-security-5-oauth2-login-signup-stateless-restful-web-services。
如何从 OAuth2 SSO Principal
获取详细信息到我的 JWT? (OAuth2Authentication
getDetails
的实例为 OAuth2AuthenticationDetails
getDecodedDetails
returns null
)
我有...
- Angular 6 客户端 w/ 作为
acme
客户端隐式登录(使用angular-oauth2-oidc
) Spring 使用 JWT
TokenService
配置和第 3 方 SSO 到 GitHub 启动 OAuth2 授权服务器
Auth 服务器配置
acme
作为implicit
和 GitHub 客户端用于 SSO- Auth 服务器暴露了一个
/login/github
- Auth 服务器公开一个
/me
(受 ResourceServer 配置保护)
当我登录时...
- Angular 应用程序重定向到 Auth 服务登录
- 授权服务重定向到 GitHub
- [用户验证]
- GitHub 重定向到 Auth 服务
- Auth 服务启动 session 并颁发令牌
- Auth 服务重定向到 Angular
- 浏览器令牌是正确的 JWT
现在,当我与 Auth Service 通信时 /me
:
- 我直接得到一个
Principal
,其中包含 GitHub 的所有详细信息(耶) - 间接从 Angular 应用程序通过
Authorization: Bearer ...
header 传递令牌,我得到一个Principal
,其中包含acme
的最低限度 OAuth 客户端信息客户(呃)
我试过自定义 TokenEnhancer
,但 OAuth2Authentication
实例已经是最低限度的,没有任何细节。而且,当调用从 Angular 发起时,它没有与我直接调用它时相同的 session cookie(我不想共享 session - 我想将详细信息放在 JWT 中)。
[更新 #1]
我尝试了自定义 JwtAccessTokenConverter
并在 @EnableAuthorizationServer
和 @EnableResourceServer
(保护 /me
端点)配置中使用了它 类。但是它没有用。我仍然从 OAuth2Authentication
.
final JwtAccessTokenConverter converter = new JwtAccessTokenConverter();
converter.setAccessTokenConverter(new CustomTokenConverter());
方式Spring Lemon does this is replacing the OAuth2 and OpenID connect user services (see spring security docs)。有关详细信息,请参阅 LemonOAuth2UserService
和 LemonOidcUserService
。对于无状态,它将客户端一个短暂的 JWT 令牌作为参数传递给 targetUrl,如您在其 OAuth2AuthenticationSuccessHandler
class 中所见。它使用一些 cookie 机制来无状态地执行所有这些操作,可以通过查看它的 HttpCookieOAuth2AuthorizationRequestRepository
及其配置方式来进一步理解。
这里有一篇文章对此进行了更详细的解释:https://www.naturalprogrammer.com/blog/1681261/spring-security-5-oauth2-login-signup-stateless-restful-web-services。