JavaRush /Курсы /Модуль 5. Spring /Введение в OAuth2 и JWT для микросервисов

Введение в OAuth2 и JWT для микросервисов

Модуль 5. Spring
10 уровень , 9 лекция
Открыта

Давайте начнем наше приключение с простого вопроса:

"Что же такое OAuth2?"

OAuth2 (Open Authorization 2.0) — это протокол авторизации, который позволяет приложениям получать ограниченный доступ к ресурсам от имени пользователя без передачи паролей напрямую. Звучит немного заумно? Давайте разберем это на примере.

Как работает OAuth2: история одного капкейка

Давайте представим ситуацию. У вас есть личный шкафчик в модном кафе, где хранятся ваши любимые капкейки. Но вместо того чтобы отдавать бариста свой личный ключ (пароль), вы даете ему временный жетон с ограниченными правами.

Что может сделать бариста с этим жетоном?

  • Открыть именно ваш шкафчик ✓
  • Достать только капкейк ✓
  • Заглянуть в другие шкафчики ✗
  • Использовать жетон завтра ✗

Это и есть OAuth2 в действии! Ваш личный ключ (логин и пароль) остается только у вас, а сервисы получают временные жетоны (токены) с четко определенными правами. Никаких лишних доступов, никаких рисков компрометации ваших учетных данных.

Как в реальном кафе вы не дадите незнакомцу ключи от своего дома, так и в веб-приложении OAuth2 защищает ваши данные, выдавая только временные пропуска с минимально необходимыми правами.

Принципы работы OAuth2

Для того чтобы глубже понять мотивацию и устройство протокола, давайте рассмотрим его основные "потоки" работы.

OAuth2 использует так называемые потоки аутентификации. Они определяют, как пользователь будет получать токен доступа, в зависимости от характера приложения.

Основные потоки аутентификации:

  1. Authorization Code (Код авторизации): используется для серверных приложений, где фронтенд запрашивает сервер, а сервер в свою очередь запрашивает авторизацию у пользователя.
  2. Implicit (Имплицитный поток): этот поток оптимизирован для клиентских приложений (например, SPA). Токен доступа выдается напрямую через браузер.
  3. Client Credentials (Учетные данные клиента): используется для взаимодействия сервер-сервер, где пользовательская сессия не требуется.
  4. 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 отлично сочетается с микросервисной архитектурой, потому что:

  1. Он самодостаточен. Подписанные данные в JWT позволяют каждому микросервису проверить токен на подлинность без опроса центрального сервера.
  2. Он компактен. Токен легко передается между микросервисами через HTTP-заголовки.
  3. Упрощает масштабируемость. Система аутентификации может быть распределена, так как каждый сервис работает с токенами автономно.

Примеры интеграции 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 с помощью этих технологий.

Комментарии
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ