Безопасность: - Секреты (токены JWT, пароль БД) теперь читаются из переменных окружения - Удалены секретные данные из application.yaml - Добавлен .env.example для документации - .env уже в .gitignore Изменения: - Обновлен config.go для загрузки переменных окружения - Добавлена библиотека godotenv для удобной работы с .env - Добавлена валидация обязательных переменных окружения - Поддержка переопределения любых настроек через env Обязательные переменные окружения: - DB_PASSWORD - пароль базы данных - ACCESS_TOKEN_SECRET - секрет для access токенов - REFRESH_TOKEN_SECRET - секрет для refresh токенов Опциональные переопределения: - DB_HOST, DB_PORT, DB_NAME, DB_USER - ACCESS_TOKEN_TTL_MINUTES, REFRESH_TOKEN_TTL_MINUTES - SERVER_PORT Документация: - Добавлен README.md с полной документацией API - Описание структуры проекта - Инструкции по настройке и запуску - Примеры использования API 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
274 lines
6.6 KiB
Markdown
274 lines
6.6 KiB
Markdown
# 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 <repository-url>
|
||
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 <access_token>
|
||
```
|
||
|
||
#### Получить всех пользователей (любой авторизованный)
|
||
```http
|
||
GET /auth-service/api/users
|
||
Authorization: Bearer <token>
|
||
```
|
||
|
||
#### Получить пользователя по username (любой авторизованный)
|
||
```http
|
||
GET /auth-service/api/users/:username
|
||
Authorization: Bearer <token>
|
||
```
|
||
|
||
#### Изменить роль пользователя (только Admin)
|
||
```http
|
||
POST /auth-service/api/users/:username
|
||
Authorization: Bearer <admin_token>
|
||
Content-Type: application/json
|
||
|
||
{
|
||
"role": "teacher"
|
||
}
|
||
```
|
||
|
||
#### Удалить пользователя (только Admin)
|
||
```http
|
||
DELETE /auth-service/api/users/:username
|
||
Authorization: Bearer <admin_token>
|
||
```
|
||
|
||
## Роли
|
||
|
||
- `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
|