# Authorization Service Сервис авторизации и аутентификации с использованием JWT токенов. ## Возможности - Регистрация и аутентификация пользователей - JWT токены (Access и Refresh) - Проверка срока истечения токенов - Обновление токенов через Refresh Token - Ролевая система доступа (Student, Teacher, Admin) - Гибкая система middleware для авторизации ## Технологии - Go 1.21+ - PostgreSQL - Gin Web Framework - JWT (golang-jwt/jwt) - YAML конфигурация - Переменные окружения для секретов ## Быстрый старт ### 1. Клонирование репозитория ```bash git clone cd authorization ``` ### 2. Настройка переменных окружения Скопируйте `.env.example` в `.env` и заполните своими значениями: ```bash cp .env.example .env ``` Отредактируйте `.env`: ```env # Database DB_PASSWORD=your_secure_password DB_HOST=localhost DB_PORT=5432 DB_USER=postgres DB_NAME=authorization # JWT Secrets (ВАЖНО: Используйте сложные случайные строки!) # Генерация: openssl rand -base64 32 ACCESS_TOKEN_SECRET=your_access_token_secret_here REFRESH_TOKEN_SECRET=your_refresh_token_secret_here ``` ### 3. Настройка базы данных Запустите PostgreSQL через Docker: ```bash docker-compose up -d ``` Или вручную создайте базу данных: ```sql CREATE DATABASE authorization; ``` Примените миграции: ```bash # Используйте migrate CLI или запустите SQL скрипты из schema/ ``` ### 4. Установка зависимостей ```bash go mod download ``` ### 5. Запуск приложения ```bash go run cmd/main.go ``` Сервер запустится на `http://localhost:8081` ## API Эндпоинты ### Публичные (без авторизации) #### Регистрация ```http POST /auth-service/auth/sign-up Content-Type: application/json { "name": "John Doe", "username": "john", "password": "securepassword" } ``` #### Вход ```http POST /auth-service/auth/sign-in Content-Type: application/json { "username": "john", "password": "securepassword" } ``` Ответ: ```json { "accessToken": "eyJhbGc...", "refreshToken": "eyJhbGc..." } ``` #### Обновление токена ```http POST /auth-service/auth/refresh Content-Type: application/json { "refreshToken": "eyJhbGc..." } ``` ### Защищенные эндпоинты Все запросы должны содержать заголовок: ``` Authorization: Bearer ``` #### Получить всех пользователей (любой авторизованный) ```http GET /auth-service/api/users Authorization: Bearer ``` #### Получить пользователя по username (любой авторизованный) ```http GET /auth-service/api/users/:username Authorization: Bearer ``` #### Изменить роль пользователя (только Admin) ```http POST /auth-service/api/users/:username Authorization: Bearer Content-Type: application/json { "role": "teacher" } ``` #### Удалить пользователя (только Admin) ```http DELETE /auth-service/api/users/:username Authorization: Bearer ``` ## Роли - `student` - базовая роль - `teacher` - роль преподавателя - `admin` - административная роль ## Система авторизации Проект использует двухуровневую систему middleware: 1. **userIdentity** - базовый middleware, проверяет валидность токена 2. **requireRole** - проверяет роль пользователя Примеры: ```go // Все авторизованные users.GET("", h.getAllUsers) // Только учителя и админы users.PUT("/:id", h.requireTeacher(), h.updateUser) // Только админы users.DELETE("/:id", h.requireAdmin(), h.deleteUser) ``` ## Структура проекта ``` authorization/ ├── cmd/ │ └── main.go # Точка входа ├── internal/ │ ├── config/ # Конфигурация │ ├── handler/ # HTTP handlers │ │ ├── auth.go │ │ ├── middleware.go # Middleware авторизации │ │ └── users.go │ ├── repository/ # Слой БД │ └── service/ # Бизнес-логика │ ├── auth.go │ └── auth_test.go ├── configs/ │ └── application.yaml # Конфигурация (без секретов!) ├── schema/ # SQL миграции ├── .env # Переменные окружения (НЕ коммитить!) ├── .env.example # Пример .env └── docker-compose.yaml # Docker конфигурация ``` ## Переменные окружения ### Обязательные - `DB_PASSWORD` - пароль БД - `ACCESS_TOKEN_SECRET` - секрет для access токенов - `REFRESH_TOKEN_SECRET` - секрет для refresh токенов ### Опциональные - `DB_HOST` - хост БД (default: localhost) - `DB_PORT` - порт БД (default: 5432) - `DB_USER` - пользователь БД (default: postgres) - `DB_NAME` - имя БД (default: authorization) - `SERVER_PORT` - порт сервера (default: 8081) - `ACCESS_TOKEN_TTL_MINUTES` - время жизни access токена (default: 15) - `REFRESH_TOKEN_TTL_MINUTES` - время жизни refresh токена (default: 90) ## Безопасность ⚠️ **ВАЖНО:** 1. Никогда не коммитьте файл `.env` в репозиторий 2. Используйте сложные случайные строки для токенов 3. Генерация секретов: `openssl rand -base64 32` 4. В продакшене используйте HTTPS 5. Регулярно ротируйте секреты ## Разработка ### Запуск тестов ```bash go test ./... ``` ### Запуск с hot reload ```bash air ``` ## Docker Запуск всего стека (app + postgres): ```bash docker-compose up ``` ## Лицензия MIT