Аутентификация и регистрация
Relevant source files
The following files were used as context for generating this wiki page:
- internal/features/auth/service/login.go
- internal/features/auth/service/register.go
- internal/features/auth/service/refresh.go
- internal/features/auth/service/logout.go
- internal/features/auth/service/service.go
- internal/features/auth/repository/postgres/refresh_token_repository.go
- internal/core/middleware/middleware.go
- internal/features/users/repository/postgres/user_repository.go
- migrations/001_init.up.sql
Система аутентификации и регистрации в проекте Music Service обеспечивает управление доступом пользователей, безопасное хранение учетных данных и механизм сессий на основе JSON Web Tokens (JWT). Модуль поддерживает регистрацию новых пользователей, вход по email и паролю, обновление токенов (refresh) и выход из системы (logout).
Основная архитектура построена на разделении ответственности между транспортным слоем (HTTP), сервисным слоем (бизнес-логика) и слоем данных (PostgreSQL). Безопасность паролей обеспечивается использованием алгоритма bcrypt, а авторизация запросов — через AuthMiddleware с проверкой подписи JWT.
Sources: internal/features/auth/service/service.go, internal/core/middleware/middleware.go, README.md
Архитектура системы
Система использует стандартную для проекта многослойную архитектуру. Слой AuthService взаимодействует с репозиториями пользователей и токенов обновления для выполнения операций.
Компоненты системы
| Компонент | Описание | Файл |
|---|---|---|
| AuthService | Центральный узел бизнес-логики аутентификации. | internal/features/auth/service/service.go |
| UserRepository | Управление данными пользователей в PostgreSQL. | internal/features/users/repository/postgres/user_repository.go |
| RefreshTokenRepository | Хранение и валидация токенов обновления. | internal/features/auth/repository/postgres/refresh_token_repository.go |
| AuthMiddleware | Перехватчик запросов для проверки JWT в заголовке Authorization. | internal/core/middleware/middleware.go |
Sources: internal/features/auth/service/service.go:34-41, internal/core/middleware/middleware.go:121-155
Процесс регистрации (Register)
При регистрации система создает нового пользователя с ролью USER и типом подписки FREE. Пароль хэшируется с использованием bcrypt.DefaultCost перед сохранением в базу данных.
Ключевые особенности:
- Проверка уникальности
emailиusernameна уровне БД (индексыUNIQUE). - Установка начальных значений:
role = 'USER',subscription_type = 'FREE'.
Sources: internal/features/auth/service/register.go:17-45, migrations/001_init.up.sql:1-10
Аутентификация и сессии (Login)
Вход в систему осуществляется путем проверки соответствия хэша пароля в базе данных. В случае успеха генерируется пара токенов: Access Token (короткоживущий) и Refresh Token (долгоживущий).
Механизм токенов
- Access Token: JWT, содержащий
user_id,email,roleиsubscription_type. Подписывается секретным ключомHS256. - Refresh Token: Случайная строка (32 байта, hex), сохраняемая в таблице
refresh_tokens.
Обновление токенов (Refresh & Rotation)
Система реализует механизм ротации токенов: при каждом обновлении старый Refresh Token удаляется, а пользователю выдается новая пара (Access + Refresh). Это повышает безопасность, ограничивая время жизни украденного токена.
Логика процесса:
- Поиск
user_idпо предоставленномуrefresh_tokenв БД. - Проверка срока годности (
expires_at > NOW()). - Удаление старого токена.
- Генерация и сохранение нового токена.
Sources: internal/features/auth/service/refresh.go:16-58, internal/features/auth/repository/postgres/refresh_token_repository.go:40-52
Модели данных
Таблица users
Хранит основную информацию о пользователях и их правах.
Sources: migrations/001_init.up.sql:1-10
| Поле | Тип | Описание |
|---|---|---|
id | BIGSERIAL | Первичный ключ |
email | VARCHAR(255) | Уникальный email |
password_hash | VARCHAR(255) | Хэш пароля (bcrypt) |
role | VARCHAR(50) | Роль (по умолчанию 'USER') |
subscription_type | VARCHAR(50) | Тип подписки ('FREE', 'PREMIUM') |
Таблица refresh_tokens
Используется для управления активными сессиями.
Sources: migrations/001_init.up.sql:12-18
| Поле | Тип | Описание |
|---|---|---|
user_id | BIGINT | Ссылка на пользователя (FK) |
token | VARCHAR(500) | Уникальная строка токена |
expires_at | TIMESTAMP | Дата истечения |
Безопасность и Middleware
Для защиты эндпоинтов используется AuthMiddleware. Оно извлекает токен из заголовка Authorization: Bearer <token>, валидирует его и помещает данные пользователя (Claims) в контекст запроса.
// internal/core/middleware/middleware.go:121
func AuthMiddleware(secret string) func(http.Handler) http.Handler {
// ... логика парсинга и валидации JWT ...
}
Проверки в Middleware:
- Наличие заголовка
Authorization. - Префикс
Bearer. - Валидность подписи токена.
- Срок действия токена (Expiration).
Дополнительно реализован RequireRole(role), который ограничивает доступ к API (например, только для ADMIN).
Sources: internal/core/middleware/middleware.go:121-155, internal/core/middleware/middleware.go:157-169
Резюме
Модуль "Аутентификация и регистрация" обеспечивает надежный фундамент для безопасности Music Service. Использование JWT в сочетании с механизмом ротации Refresh-токенов позволяет создавать масштабируемые stateless-сессии, а хранение хэшей bcrypt гарантирует защиту учетных данных пользователей в случае компрометации базы данных.