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

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

Модуль 5. Spring
Рівень 17 , Лекція 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 за допомогою цих технологій.

Коментарі
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ