# Rust: как создать сервер аутентификации с Warp и JWT

Источник: https://www.youtube.com/watch?v=6oMoHZZeyb0
Канал: freeCodeCamp.org
Опубликовано: 22.09.2023

---

## Создание аутентификационного сервера на Rust: Warp и JWT 🦀
[[JUMP:0:00]]

В этом руководстве опытный Rust-разработчик Акил Шарма (Akil Sharma) демонстрирует процесс создания полноценного сервера аутентификации на языке Rust. В качестве основы для API используется легковесный веб-фреймворк **Warp**, позволяющий быстро развернуть решение без избыточности, свойственной более крупным фреймворкам вроде Actix или Rocket. Проект включает в себя не только аутентификацию через **JWT** (JSON Web Token), но и продвинутую систему ролевой авторизации (пользователь/админ), а также детальную обработку ошибок.

### 🛠 Архитектура проекта и инструменты
[[JUMP:1:17]]

В данном проекте для хранения пользователей вместо полноценной базы данных используется `HashMap`, хранящийся в оперативной памяти. Это позволяет сфокусироваться на логике работы JWT и механизмах фильтрации запросов.

*   **Rust**: основной язык разработки.
*   **Warp**: высокопроизводительный и лаконичный веб-фреймворк.
*   **JWT**: стандарт для передачи авторизационных данных.
*   **Tokio**: асинхронная среда выполнения.
*   **Serde**: пакет для сериализации и десериализации JSON-запросов.
*   **Chrono**: библиотека для работы с датами и временем, необходимая для установки срока действия токенов.

### 🏗 Структура данных и авторизация
[[JUMP:10:59]]

Для корректной работы сервера необходимо определить структуры данных (`struct`), которые будут представлять пользователей и запросы. Акил Шарма отмечает, что при работе с фреймворками в Rust важно заранее понимать основы типов данных: `struct` позволяет создавать кастомные типы для управления состоянием пользователя.

1.  **User**: содержит `uid`, `email`, `password` и `role`.
2.  **LoginRequest**: только `email` и `password` для отправки данных.
3.  **LoginResponse**: возвращает сгенерированный токен.

Ролевая модель разделяет права доступа: обычный пользователь может обращаться только к своему маршруту, в то время как администратор имеет доступ как к пользовательским, так и к административным ресурсам.

### 🔐 Реализация логики JWT и маршрутизация
[[JUMP:38:49]]

Основная магия происходит в модуле `auth.rs`, где реализованы функции кодирования и декодирования токенов.

*   **Генерация токена**: используется алгоритм HS512. Токен включает в себя `claims` (uid, роль) и время жизни, установленное через Chrono (60 секунд).
*   **Валидация**: при каждом запросе middleware-фильтр `with_auth` извлекает заголовок `Authorization`, проверяет наличие префикса `Bearer` и декодирует токен для проверки прав доступа.

По словам Шармы, Rust требует явного описания всех типов и обработчиков, что, хоть и добавляет «boilerplate-кода», значительно повышает безопасность и надежность системы, предотвращая типичные ошибки выполнения.

### ⚠️ Обработка ошибок
[[JUMP:1:15:08]]

Для создания production-ready приложения автор внедряет систему обработки ошибок через перечисление `enum Errors`.

*   Определены конкретные сценарии: `WrongCredentialsError`, `JWTTokenError`, `NoPermissionError`.
*   Функция `handle_rejection` перехватывает ошибки и конвертирует их в соответствующие HTTP-статусы (например, 401 Unauthorized или 403 Forbidden), что позволяет API корректно отвечать клиенту в случае сбоя.

В завершение Акил Шарма напоминает, что весь исходный код доступен в его репозитории на GitHub под ником `akhilsharma90`, а сам процесс написания кода на Rust требует дисциплины и понимания того, как работают потоки данных в асинхронном окружении.