Перейти к основному содержимому

Аутентификация в Amazon Cognito с использованием Spring Security

· 4 мин. чтения

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:

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

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

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

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

3.2. Настройка весны

Поскольку мы хотим использовать вход OAuth 2.0, нам нужно добавить в наше приложение зависимости spring-security-oauth2-client и spring-security-oauth2-jose :

<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-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 .