аутентификация по refresh_token в spring-security-oauth2
Я использую spring-security-oauth2, spring-security-jwt в реализации своего сервиса авторизации. По дефолту в спринге имеется TokenEndpoint который принимает REST запросы на свой мапинг по /oauth/token для выдачи токена.
Но я хочу реализовать обращение к TokenEndpoint через код, таким образом, чтоб сервис авторизации - REST запросы с фронта принимал в своих собственных контролерах к примеру так@GetMapping(value = "/getUserToken", produces = MediaType.APPLICATION_JSON_VALUE), а после, обращался к TokenEndpoint без какого либо REST запроса, передав ему то что необходимо для выполнения, а именно Principal и параметры, как указанно в сигнатуре одного из методов TokenEndpoint :
@RequestMapping(
value = {"/oauth/token"},
method = {RequestMethod.POST}
)
public ResponseEntity<OAuth2AccessToken> postAccessToken(Principal principal, @RequestParam Map<String, String> parameters)
То что я хочу, я от части реализовал. А именно я смог получить accessToken передав в качестве principal заранее сформированный new UsernamePasswordAuthenticationToken(name, pass, null) (для аутентификации по логину и паролю) который так же прогнал через AuthenticationManager (который как правило наполняет UsernamePasswordAuthenticationToken остальной информацией) и сунул в выше приведенный метод postAccessToken. Все получилось, я получил свой accessToken , дальше он ответом возвращается в мой контролер откуда он благополучно отправляется на фронт и кажись все, ура.
Но тут встала другая задача, надо как то получить новый токен по refresh_token. И по идее я должен так же передать в postAccessToken соответствующие параметры - что то типа "name":"12345678", "clientId":"service-ui", "grantType":"refresh_token", "refresh_token": "токен.." и как велел гугл с документацией - все получится. Но мне то нужно туда передать то что соответствует выше представленной сигнатуре, если с параметрами все ясно то возникает впорос как мне аутентифицировать по refresh_token.
Если с логином и паролем я использовал UsernamePasswordAuthenticationToken, а с refresh_token не знаю. Тут вот и проблема я не знаю как на уровне кода сделать аутентификацию по refresh_token.
Смотрел имплементации интерфейса Authentication там есть и RunAsUserToken, RememberMeAuthenticationToken, RememberMeAuthenticationToken, PreAuthenticatedAuthenticationToken и другие.. Почитал о них, кажется ничего не подходит.. Может я как то не правильно смотрю на проблему и решение лежит совсем в другом подходе..?