Files
auth-service/README.md
Ганеев Артем 83910be95d Переход на использование переменных окружения для секретов
Безопасность:
- Секреты (токены 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>
2025-10-28 21:30:12 +03:00

274 lines
6.6 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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