Spring Boot OAuth2, когда создается неявный JWT?

Как я могу получить подробности от OAuth2 SSO Principal в мой JWT? (экземпляр OAuth2AuthenticationgetDetails как OAuth2AuthenticationDetailsgetDecodedDetails возвращается null)

Я имею...

  • Клиент Angular 6 с неявным входом в систему как acme клиент (используя angular-oauth2-oidc)
  • Сервер авторизации Spring Boot OAuth2 с JWT TokenService конфигурация со сторонним SSO для GitHub

  • Сервер аутентификации настроен с acme как implicit и клиент GitHub для единого входа

  • Auth сервер выставляет /login/github
  • Auth сервер выставляет /me (защищено конфигурацией ResourceServer)

Когда я захожу...

  1. Приложение Angular перенаправляет на сервис авторизации
  2. Сервис аутентификации перенаправляет на GitHub
  3. [Пользователь аутентифицируется]
  4. GitHub перенаправляет на сервис аутентификации
  5. Auth Service инициирует сеанс и выдает токен
  6. Служба аутентификации перенаправляет на Angular
  7. Маркер браузера - это правильный 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.

Другие вопросы по тегам