Spring Boot OAuth2, когда создается неявный JWT?
Как я могу получить подробности от OAuth2 SSO Principal
в мой JWT? (экземпляр OAuth2Authentication
getDetails
как OAuth2AuthenticationDetails
getDecodedDetails
возвращается null
)
Я имею...
- Клиент Angular 6 с неявным входом в систему как
acme
клиент (используяangular-oauth2-oidc
) Сервер авторизации Spring Boot OAuth2 с JWT
TokenService
конфигурация со сторонним SSO для GitHubСервер аутентификации настроен с
acme
какimplicit
и клиент GitHub для единого входа- Auth сервер выставляет
/login/github
- Auth сервер выставляет
/me
(защищено конфигурацией ResourceServer)
Когда я захожу...
- Приложение Angular перенаправляет на сервис авторизации
- Сервис аутентификации перенаправляет на GitHub
- [Пользователь аутентифицируется]
- GitHub перенаправляет на сервис аутентификации
- Auth Service инициирует сеанс и выдает токен
- Служба аутентификации перенаправляет на Angular
- Маркер браузера - это правильный JWT
Теперь, когда я общаюсь с Auth Service /me
:
- Прямо я получаю
Principal
который содержит ВСЕ детали из GitHub (yay) - Косвенно из приложения Angular, передавающего токен через
Authorization: Bearer ...
заголовок, я получаюPrincipal
которая содержит минимум информации о клиенте OAuth дляacme
клиент (тьфу)
Я пробовал кастом 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). Увидеть LemonOAuth2UserService
а также LemonOidcUserService
для деталей. Для сохранения состояния он передает клиенту кратковременный токен JWT в качестве параметра targetUrl, как вы можете видеть в его OAuth2AuthenticationSuccessHandler
учебный класс. Он использует некоторый механизм куки для выполнения всего этого без сохранения состояния, что можно понять, посмотрев на его HttpCookieOAuth2AuthorizationRequestRepository
и как это настроено.
Вот статья, объясняющая это более подробно: https://www.naturalprogrammer.com/blog/1681261/spring-security-5-oauth2-login-signup-stateless-restful-web-services.