«1. Введение

В этом руководстве мы рассмотрим, как мы можем использовать поддержку OAuth 2.0 Spring Security для аутентификации с помощью Amazon Cognito.

Попутно мы кратко рассмотрим, что такое Amazon Cognito и какие потоки OAuth 2.0 он поддерживает.

В итоге у нас будет простое одностраничное приложение. Ничего фантастического.

2. Что такое Amazon Cognito?

Cognito — это служба идентификации пользователей и синхронизации данных, которая позволяет нам легко управлять пользовательскими данными для наших приложений на нескольких устройствах.

С помощью Amazon Cognito мы можем:

    создавать, аутентифицировать и авторизовывать пользователей для наших приложений создавать удостоверения для пользователей наших приложений, которые используют других общедоступных поставщиков удостоверений, таких как Google, Facebook или Twitter сохранять пользовательские данные нашего приложения в ключе пары значений

3. Настройка

3.1. Настройка Amazon Cognito

В качестве поставщика удостоверений Cognito поддерживает гранты author_code, неявные и client_credentials. Для наших целей давайте настроим использование типа гранта author_code.

Во-первых, нам нужно немного настроить Cognito:

    Создать пул пользователей Добавить пользователя — мы будем использовать этого пользователя для входа в наше приложение Spring Создать клиент приложения Настроить клиент приложения

В конфигурации клиента приложения убедитесь, что CallbackURL соответствует redirect-uri из конфигурационного файла Spring. В нашем случае это будет:

http://localhost:8080/login/oauth2/code/cognito

Разрешенным потоком OAuth должно быть предоставление кода авторизации. Затем на той же странице нам нужно установить для разрешенной области OAuth значение openid.

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

3.2. Настройка Spring

Поскольку мы хотим использовать вход OAuth 2.0, нам нужно добавить в наше приложение соответствующие зависимости Spring Security:

<dependency>
    <groupId>org.springframework.security</groupId>
    <artifactId>spring-boot-starter-security-oauth2-client</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.security</groupId>
    <artifactId>spring-security-oauth2-jose</artifactId>
</dependency>

И затем нам понадобится некоторая конфигурация, чтобы связать все вместе: ~ ~~

spring:
  security:
    oauth2:
      client:
        registration:
          cognito:
            clientId: clientId
            clientSecret: clientSecret
            scope: openid
            redirect-uri: http://localhost:8080/login/oauth2/code/cognito
            clientName: clientName
        provider:
          cognito:
            issuerUri: https://cognito-idp.{region}.amazonaws.com/{poolId}
            user-name-attribute: cognito:username

В приведенной выше конфигурации свойства clientId, clientSecret, clientName и issuerUri должны быть заполнены в соответствии с нашим пулом пользователей и клиентом приложения, созданным на AWS.

И с этим у нас должны быть настроены Spring и Amazon Cognito! Остальная часть руководства определяет конфигурацию безопасности нашего приложения, а затем просто связывает пару незавершенных вопросов.

3.3. Конфигурация безопасности Spring

Теперь мы добавим класс конфигурации безопасности:

@Configuration
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.csrf()
          .and()
          .authorizeRequests(authz -> authz.mvcMatchers("/")
            .permitAll()
            .anyRequest()
            .authenticated())
          .oauth2Login()
          .and()
          .logout()
          .logoutSuccessUrl("/");
    }
}

Здесь мы сначала указали, что нам нужна защита от CSRF-атак, а затем разрешили всем доступ к нашей целевой странице. После этого мы добавили вызов oauth2Login для подключения к регистрации клиента Cognito.

4. Добавьте целевую страницу

Затем мы добавим простую целевую страницу Thymeleaf, чтобы мы знали, когда мы вошли в систему:

<div>
    <h1 class="title">OAuth 2.0 Spring Security Cognito Demo</h1>
    <div sec:authorize="isAuthenticated()">
        <div class="box">
            Hello, <strong th:text="${#authentication.name}"></strong>!
        </div>
    </div>
    <div sec:authorize="isAnonymous()">
        <div class="box">
            <a class="button login is-primary" th:href="@{/oauth2/authorization/cognito}">
              Log in with Amazon Cognito</a>
        </div>
    </div>
</div>

Проще говоря, это будет отображать наше имя пользователя, когда мы повторно вошли в систему или ссылку для входа, когда мы этого не делаем. Обратите особое внимание на то, как выглядит ссылка, так как она берет часть cognito из нашего файла конфигурации.

А затем давайте удостоверимся, что мы привязываем корень приложения к нашей странице приветствия:

@Configuration
public class CognitoWebConfiguration implements WebMvcConfigurer {
    @Override
    public void addViewControllers(ViewControllerRegistry registry) {
        registry.addViewController("/").setViewName("home");
    }
}

5. Запускаем приложение

Это класс, который запустит все, что связано с аутентификацией:

@SpringBootApplication
public class SpringCognitoApplication {
    public static void main(String[] args) {
        SpringApplication.run(SpringCognitoApplication.class, args);
    }
}

~ ~~ Теперь мы можем запустить наше приложение, перейти по адресу http://localhost:8080 и щелкнуть ссылку для входа. При вводе учетных данных для пользователя, которого мы создали в AWS, мы должны увидеть сообщение Hello, username.

6. Заключение

В этом руководстве мы рассмотрели, как мы можем интегрировать Spring Security с Amazon Cognito с помощью простой настройки. А затем мы собираем все вместе с помощью всего нескольких фрагментов кода.

Как всегда, код, представленный в этой статье, доступен на Github.