Давай почнемо нашу пригоду з простого питання:
"Що ж таке 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 за допомогою цих технологій.
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ