Как обновить токен OAuth2 с помощью клиента Spring Security 5 OAuth2 и RestTemplate

В Spring Security 5.1.0.M2 (примечания к выпуску) добавлена ​​поддержка автоматического обновления токенов при использовании WebClient. Однако я использую RestTemplate. Есть ли аналогичный механизм для RestTemplate или мне нужно реализовать такое поведение самостоятельно?

Класс OAuth2RestTemplate выглядит многообещающим, но он из отдельного модуля Spring Security OAuth, и я хотел бы по возможности использовать на клиенте простой Spring Security 5.1.

Если допустимо использовать WebClient вместо RestTemplate, возможно, вы можете использовать решение описанный.

m4gic 01.10.2018 14:23

@ m4gic, пока нет, потому что REST-клиент будет сгенерирован с помощью swagger codegen.

Steffen Harbich 01.10.2018 15:40

Хм вроде будет нелегко

m4gic 01.10.2018 15:46
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
6
3
4 415
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

OAuth2RestTemplate Обновит токены автоматически. RestTemplate не будет (токены обновления являются частью спецификации OAut2, следовательно, OAuth2RestTemplate.

У вас есть 2 варианта:

  1. Используйте модуль Spring Security OAuth2, и все будет работать практически сразу из коробки (свойства конфигурации предоставляются Spring)
  2. Создайте свой собственный RestTemplate на основе Spring OAut2RestTemplate

Модуль Spring OAuth2 будет интегрирован в Spring Security в будущем. Я бы выбрал вариант 1.

Можете ли вы указать на официальную документацию, в которой говорится, что токены обновляются автоматически. Для моего приложения с типом предоставления кода авторизации они не обновляются, и все перестает работать через 1 час (время истечения срока действия токена доступа)

Nikhil Sahu 05.12.2018 08:56

@Nikhil, у меня тоже самое происходит. Приложение перестало работать после истечения срока действия accessToken. Удалось ли вам исправить проблему?

Minisha 11.02.2020 10:25

@Minisha есть определенная конфигурация (точно не помню), которую нужно изменить, чтобы поток управления автоматически переходил в поток токенов обновления, когда токены аутентификации истекли. Используйте OAuth2RestTemplate и войдите в поток управления, чтобы отладить это.

Nikhil Sahu 24.04.2020 18:50

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 11.02.2020 10:38

@Minisha, нет, остался с решением, описанным в этом ответе.

Adomas 11.02.2020 11:30

получение токена доступа здесь вы написали вызов restTemplate для получения токена?

Minisha 11.02.2020 20:11

вы можете поделиться репо? когда токен истек, я получаю 401

Minisha 12.02.2020 00:13

@Minisha, чтобы получить токен, вы делаете простой пост в службу аутентификации

Adomas 12.02.2020 10:20

Конечно. для меня ни одно из решений не сработало. Поэтому мне нужно вручную установить для accessToken значение null.

Minisha 12.02.2020 10:48

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