«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.