Spring Secuity 5: сохранитесь и получите доступ к Oauth2 refre sh token - PullRequest
0 голосов
/ 24 марта 2020

Как мое клиентское приложение Spring Boot получает доступ к токену refre sh, предоставленному, например, Google в Spring Security 5?

Довольно простой вопрос. Удаленный сервер авторизации (например, Google) отправляет токен refre sh, и я хочу его использовать. Какой лучший способ сохранить и извлечь его в Spring Security 5?

Кажется, этот ответ , этот вопрос , эта внешняя ссылка Опишите подход, который больше не совместим, поскольку Oauth2 стал первоклассным гражданином в Spring Security 5.

Контекст:

Refre sh токены позволяют клиентскому приложению продолжать работу получить доступ к ресурсам после истечения сеанса пользователя. Согласно документам Google , токены refre sh должны быть постоянными:

Приложение должно хранить токен refre sh для будущего использования и использовать токен доступа для доступа к Google. API.

Spring Security делает токен доступа широко доступным в виде OAuth2AuthenticationToken , но токен refre sh там не включен.

Токен refre sh также недоступен в OidcUserService (или классе, который его переопределяет), поскольку public OidcUser loadUser(OidcUserRequest userRequest) не имеет доступа к токену refre sh. Это облом, поскольку было бы неплохо переопределить OidcUserService с помощью пользовательского класса, который создает / извлекает пользователя из его OID C данные пользователя и одновременно сохраняет связанный с ним токен refre sh .

OAuth2LoginAuthenticationFilter сохраняет токен refre sh в репозитории ClientRegistrationRepository:

OAuth2AuthorizedClient authorizedClient = new OAuth2AuthorizedClient(
    authenticationResult.getClientRegistration(),
    oauth2Authentication.getName(),
    authenticationResult.getAccessToken(),
    authenticationResult.getRefreshToken());

this.authorizedClientRepository.saveAuthorizedClient(authorizedClient, oauth2Authentication, request, response);

Реализация по умолчанию сохраняет токен в переходной памяти, которая не подходит для распределенных приложений или сохраняется через перезапуски.

Кажется, есть JdbcOauth2AuthorizedClientService, с недавно добавленными документами и схемой , которая предполагает , что это может быть полезно, но не было приведено ни одного примера его настройки или использования для получения токена refre sh.

Так как же клиентскому приложению сохранить и получить доступ к токену refre sh в Spring Security 5?

1 Ответ

0 голосов
/ 02 мая 2020

JdbcOauth2AuthorizedClientService действительно подходит для вашего случая использования. Это очень просто настроить. Сначала вам нужно добавить эту таблицу в базу данных:

CREATE TABLE oauth2_authorized_client (
  client_registration_id varchar(100) NOT NULL,
  principal_name varchar(200) NOT NULL,
  access_token_type varchar(100) NOT NULL,
  access_token_value blob NOT NULL,
  access_token_issued_at timestamp NOT NULL,
  access_token_expires_at timestamp NOT NULL,
  access_token_scopes varchar(1000) DEFAULT NULL,
  refresh_token_value blob DEFAULT NULL,
  refresh_token_issued_at timestamp DEFAULT NULL,
  created_at timestamp DEFAULT CURRENT_TIMESTAMP NOT NULL,
  PRIMARY KEY (client_registration_id, principal_name)
);

Затем настройте bean-компонент JdbcOauth2AuthorizedClientService:

@Bean
public OAuth2AuthorizedClientService oAuth2AuthorizedClientService
        (JdbcOperations jdbcOperations, ClientRegistrationRepository clientRegistrationRepository) {
    return new JdbcOAuth2AuthorizedClientService(jdbcOperations, clientRegistrationRepository);
}

Обратите внимание, что в текущей реализации есть ошибка, которая приведет к быть решена с помощью версии 5.3.2 для обеспечения безопасности весной, которая должна появиться через несколько дней.

...