Давайте начнем наше приключение с простого вопроса:
"Что же такое OAuth2?"
OAuth2 (Open Authorization 2.0) — это протокол авторизации, который позволяет приложениям получать ограниченный доступ к ресурсам от имени пользователя без передачи паролей напрямую. Звучит немного заумно? Давайте разберем это на примере.
Как работает OAuth2: история одного капкейка
Давайте представим ситуацию. У вас есть личный шкафчик в модном кафе, где хранятся ваши любимые капкейки. Но вместо того чтобы отдавать бариста свой личный ключ (пароль), вы даете ему временный жетон с ограниченными правами.
Что может сделать бариста с этим жетоном?
- Открыть именно ваш шкафчик ✓
- Достать только капкейк ✓
- Заглянуть в другие шкафчики ✗
- Использовать жетон завтра ✗
Это и есть OAuth2 в действии! Ваш личный ключ (логин и пароль) остается только у вас, а сервисы получают временные жетоны (токены) с четко определенными правами. Никаких лишних доступов, никаких рисков компрометации ваших учетных данных.
Как в реальном кафе вы не дадите незнакомцу ключи от своего дома, так и в веб-приложении OAuth2 защищает ваши данные, выдавая только временные пропуска с минимально необходимыми правами.
Принципы работы OAuth2
Для того чтобы глубже понять мотивацию и устройство протокола, давайте рассмотрим его основные "потоки" работы.
OAuth2 использует так называемые потоки аутентификации. Они определяют, как пользователь будет получать токен доступа, в зависимости от характера приложения.
Основные потоки аутентификации:
- Authorization Code (Код авторизации): используется для серверных приложений, где фронтенд запрашивает сервер, а сервер в свою очередь запрашивает авторизацию у пользователя.
- Implicit (Имплицитный поток): этот поток оптимизирован для клиентских приложений (например, SPA). Токен доступа выдается напрямую через браузер.
- Client Credentials (Учетные данные клиента): используется для взаимодействия сервер-сервер, где пользовательская сессия не требуется.
- Password (Парольный поток): токен выдается через ввод логина и пароля пользователя. Используется реже из-за низкой безопасности.
Как работает OAuth2 в Spring
Чтобы использовать OAuth2 в Spring, нам нужен модуль spring-security-oauth2. Он предоставляет все необходимое для работы с серверной и клиентской частью OAuth2, в том числе обработку токенов и проверку их подлинности.
Документация OAuth2 в Spring Security
JSON Web Token (JWT)
Теперь, когда мы разобрались с OAuth2, настало время поговорить о JSON Web Token (JWT). Это формат токенов, который часто используется в микросервисной архитектуре.
JWT (JSON Web Token) — это компактный, безопасный и самодостаточный токен, содержащий информацию о пользователе и его правах доступа. Основная идея JWT заключается в том, что он закодирован и подписан, так что его можно использовать как источник правды при авторизации.
JWT состоит из трех частей, разделенных точками:
header.payload.signature
- Header (заголовок): содержит информацию о типе токена (обычно
JWT) и алгоритме шифрования (например,HS256). - Payload (данные): содержит полезную информацию, такую как ID пользователя, роли, время истечения действия токена и т.д.
- Signature (подпись): это криптографическая подпись, которая обеспечивает целостность токена и защищает его от изменения.
Пример расшифровки реального JWT:
{
"alg": "HS256",
"typ": "JWT"
}
{
"sub": "user123",
"role": "ADMIN",
"exp": 1698147200
}
Как работает JWT в микросервисах?
JWT отлично сочетается с микросервисной архитектурой, потому что:
- Он самодостаточен. Подписанные данные в JWT позволяют каждому микросервису проверить токен на подлинность без опроса центрального сервера.
- Он компактен. Токен легко передается между микросервисами через HTTP-заголовки.
- Упрощает масштабируемость. Система аутентификации может быть распределена, так как каждый сервис работает с токенами автономно.
Примеры интеграции OAuth2 и JWT в Spring
1. Настройка зависимости
Добавьте в pom.xml вашего Spring Boot приложения зависимость:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-oauth2-resource-server</artifactId>
</dependency>
2. Настройка конфигурации
В файле application.yml настройте JWT:
spring:
security:
oauth2:
resourceserver:
jwt:
issuer-uri: https://your-issuer-url
Это указывает Spring Security использование JWT для проверки токенов.
3. Создание конфигурации безопасности
Создайте класс для настройки безопасности:
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/public/**").permitAll()
.anyRequest().authenticated()
.and()
.oauth2ResourceServer()
.jwt();
}
}
4. Генерация JWT
Для генерации JWT используйте библиотеку jjwt:
Добавьте зависимость:
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-api</artifactId>
<version>0.11.5</version>
</dependency>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-impl</artifactId>
<version>0.11.5</version>
</dependency>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-jackson</artifactId>
<version>0.11.5</version>
</dependency>
Пример кода:
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import java.util.Date;
public class JwtTokenGenerator {
private static final String SECRET_KEY = "my-secret-key";
public String generateToken(String username) {
return Jwts.builder()
.setSubject(username)
.setIssuedAt(new Date())
.setExpiration(new Date(System.currentTimeMillis() + 3600000)) // 1 hour validity
.signWith(SignatureAlgorithm.HS256, SECRET_KEY)
.compact();
}
}
Примеры использования в реальных проектах
JWT и OAuth2 активно используются в микросервисных архитектурах для обеспечения безопасности. Примеры:
- Авторизация пользователей в REST API.
- Безопасная передача данных между сервисами.
- Обеспечение масштабируемости, так как токены можно проверять локально.
На этом всё! Мы познакомились с OAuth2 и JWT, поняли как их использовать в микросервисах и настроить в Spring приложении. В следующей лекции мы углубимся в реализацию и защиту REST API с помощью этих технологий.
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ