Ганеев Артем 45a308f239
All checks were successful
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 12s
Добавлен тестовый pipeline
2025-11-22 15:33:51 +03:00

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. Клонирование репозитория

git clone <repository-url>
cd authorization

2. Настройка переменных окружения

Скопируйте .env.example в .env и заполните своими значениями:

cp .env.example .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:

docker-compose up -d

Или вручную создайте базу данных:

CREATE DATABASE authorization;

Примените миграции:

# Используйте migrate CLI или запустите SQL скрипты из schema/

4. Установка зависимостей

go mod download

5. Запуск приложения

go run cmd/main.go

Сервер запустится на http://localhost:8081

API Эндпоинты

Публичные (без авторизации)

Регистрация

POST /auth-service/auth/sign-up
Content-Type: application/json

{
  "name": "John Doe",
  "username": "john",
  "password": "securepassword"
}

Вход

POST /auth-service/auth/sign-in
Content-Type: application/json

{
  "username": "john",
  "password": "securepassword"
}

Ответ:

{
  "accessToken": "eyJhbGc...",
  "refreshToken": "eyJhbGc..."
}

Обновление токена

POST /auth-service/auth/refresh
Content-Type: application/json

{
  "refreshToken": "eyJhbGc..."
}

Защищенные эндпоинты

Все запросы должны содержать заголовок:

Authorization: Bearer <access_token>

Получить всех пользователей (любой авторизованный)

GET /auth-service/api/users
Authorization: Bearer <token>

Получить пользователя по username (любой авторизованный)

GET /auth-service/api/users/:username
Authorization: Bearer <token>

Изменить роль пользователя (только Admin)

POST /auth-service/api/users/:username
Authorization: Bearer <admin_token>
Content-Type: application/json

{
  "role": "teacher"
}

Удалить пользователя (только Admin)

DELETE /auth-service/api/users/:username
Authorization: Bearer <admin_token>

Роли

  • student - базовая роль
  • teacher - роль преподавателя
  • admin - административная роль

Система авторизации

Проект использует двухуровневую систему middleware:

  1. userIdentity - базовый middleware, проверяет валидность токена
  2. requireRole - проверяет роль пользователя

Примеры:

// Все авторизованные
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. Регулярно ротируйте секреты

Разработка

Запуск тестов

go test ./...

Запуск с hot reload

air

Docker

Запуск всего стека (app + postgres):

docker-compose up

Лицензия

MIT

Description
Сервис авторизации на go
Readme 67 KiB
Languages
Go 99.7%
PowerShell 0.3%