В Spring Security 5.1.0.M2 (примечания к выпуску) добавлена поддержка автоматического обновления токенов при использовании WebClient. Однако я использую RestTemplate. Есть ли аналогичный механизм для RestTemplate или мне нужно реализовать такое поведение самостоятельно?
Класс OAuth2RestTemplate выглядит многообещающим, но он из отдельного модуля Spring Security OAuth, и я хотел бы по возможности использовать на клиенте простой Spring Security 5.1.
@ m4gic, пока нет, потому что REST-клиент будет сгенерирован с помощью swagger codegen.
Хм вроде будет нелегко




OAuth2RestTemplate Обновит токены автоматически. RestTemplate не будет (токены обновления являются частью спецификации OAut2, следовательно, OAuth2RestTemplate.
У вас есть 2 варианта:
Модуль Spring OAuth2 будет интегрирован в Spring Security в будущем. Я бы выбрал вариант 1.
Можете ли вы указать на официальную документацию, в которой говорится, что токены обновляются автоматически. Для моего приложения с типом предоставления кода авторизации они не обновляются, и все перестает работать через 1 час (время истечения срока действия токена доступа)
@Nikhil, у меня тоже самое происходит. Приложение перестало работать после истечения срока действия accessToken. Удалось ли вам исправить проблему?
@Minisha есть определенная конфигурация (точно не помню), которую нужно изменить, чтобы поток управления автоматически переходил в поток токенов обновления, когда токены аутентификации истекли. Используйте OAuth2RestTemplate и войдите в поток управления, чтобы отладить это.
OAuth2RestTemplate следует использовать вместо RestTemplate, когда требуется аутентификация JWT. Вы можете установить для него AccessTokenProvider, который расскажет, как будет извлечен токен JWT: oAuth2RestTemplate.setAccessTokenProvider(new MyAccessTokenProvider());
В классе, реализующем AccessTokenProvider, вам необходимо реализовать методы obtainAccessToken и refreshAccessToken. Таким образом, в методе obtainAccessToken можно проверить, истек ли срок действия токена, и если это так - токен получен через refreshAccessToken. Пример реализации (без подробностей о фактическом извлечении и обновлении токена):
public class MyAccessTokenProvider implements AccessTokenProvider {
@Override
public OAuth2AccessToken obtainAccessToken(OAuth2ProtectedResourceDetails details, AccessTokenRequest parameters)
throws UserRedirectRequiredException, UserApprovalRequiredException, AccessDeniedException {
if (parameters.getExistingToken() != null && parameters.getExistingToken().isExpired()) {
return refreshAccessToken(details, parameters.getExistingToken().getRefreshToken(), parameters);
}
OAuth2AccessToken retrievedAccessToken = null;
//TODO access token retrieval
return retrievedAccessToken;
}
@Override
public boolean supportsResource(OAuth2ProtectedResourceDetails resource) {
return false;
}
@Override
public OAuth2AccessToken refreshAccessToken(OAuth2ProtectedResourceDetails resource,
OAuth2RefreshToken refreshToken, AccessTokenRequest request)
throws UserRedirectRequiredException {
OAuth2AccessToken refreshedAccessToken = null;
//TODO refresh access token
return refreshedAccessToken;
}
@Override
public boolean supportsRefresh(OAuth2ProtectedResourceDetails resource) {
return true;
}
}
Не нашел способ для Spring вызывать refreshAccessToken автоматически, если кто-то знает, как это сделать - поделитесь, пожалуйста.
вы нашли способ вызвать refreshAccessToken?
@Minisha, нет, остался с решением, описанным в этом ответе.
получение токена доступа здесь вы написали вызов restTemplate для получения токена?
вы можете поделиться репо? когда токен истек, я получаю 401
@Minisha, чтобы получить токен, вы делаете простой пост в службу аутентификации
Конечно. для меня ни одно из решений не сработало. Поэтому мне нужно вручную установить для accessToken значение null.
Если допустимо использовать WebClient вместо RestTemplate, возможно, вы можете использовать решение описанный.