Создать токен доступа JWT из SAMLAuthenticationToken - PullRequest
0 голосов
/ 23 октября 2018

В своем приложении я до сих пор использовал поток предоставления пароля OAuth2 для генерации токена доступа JWT клиентам, предоставляющим свое имя пользователя и пароль с помощью Spring Security и Spring OAuth.Затем они используют этот токен во всех запросах к моему REST API Spring Boot.

Некоторые из моих клиентов теперь хотят использовать вместо этого проверку подлинности SAML.Моя идея - создать отдельную конечную точку /saml/accessToken и защитить ее с помощью Spring SAML.Когда аутентификация SAML завершена, пользователь перенаправляется обратно на /saml/accessToken, теперь с действительной аутентификацией, и получает JWT, который клиент может использовать для дальнейшей связи с моим REST API.

Мне нужен контроллерметод, который принимает аутентифицированный SAMLAuthenticationToken, генерирует JWT, используя его учетные данные, и возвращает его клиенту:

@RequestMapping(value = "/saml/accessToken")
public String getAccessToken(SAMLAuthenticationToken authentication) {
    return accessTokenFactory.create(authentication);
}

Это accessTokenFactory в приведенном выше примере, с которым мне нужна помощь.Я хотел бы как можно больше следовать экосистеме кодирования Spring и избегать использования «хакерского» решения, чтобы я мог использовать уже существующие TokenEnhancers и т. Д.


Чтолучший способ создать токен доступа JWT из SAMLAuthenticationToken?

1 Ответ

0 голосов
/ 27 ноября 2018

Как выясняется, объект Authentication для файла cookie SAML, полученного в результате успешной аутентификации SAML, на самом деле является ExpiringUsernameAuthenticationToken, а не SAMLAuthenticationToken.ExpiringUsernameAuthenticationToken#principal - это реализация User (давайте назовем ее CustomerUser), которую я установил во время аутентификации SAML в моей реализации SAMLUserDetailsService, это тот же тип User, который я использую в потоке предоставления пароля OAuth2.

Поскольку я не нашел никакого способа использования стандартного Spring OAuth-способа создания JWT для ExpiringUsernameAuthenticationToken, я написал отдельный JwtFactory#create(ExpiringUsernameAuthenticationToken) с использованием jjwt.Это приводит к чистому и простому решению.

Основной недостаток такого способа заключается в том, что JwtFactory не может использовать мои TokenEnhancer бины, которые отвечают за добавление дополнительных параметров в JWT.Поэтому существует некоторый уровень дублирования кода и логики для добавления дополнительных параметров JWT, как в TokenEnhancer s (используется Spring OAuth), так и в JwtFactory (используется вручную после проверки подлинности SAML).Это запах кода, которого следует избегать.Но взломать специфическую функциональность Spring OAuth в моем пользовательском JwtFactory кажется еще хуже, поэтому мне придется с этим смириться.

...