Микросервис авторизации и управления доступом для экосистемы SAI, построенный на базе SAI Service Framework.
- Единая точка аутентификации для всех микросервисов SAI
- Гибкая система ролей с наследованием и ограничениями
- Reference Token аутентификация с кэшированием в Redis
- Компиляция разрешений с поддержкой плейсхолдеров
- Rate limiting по пользователям
- Суперпользователь с неограниченным доступом
- REST API с автоматической документацией
# Клонируем репозиторий
git clone <repository-url>
cd github.com/saiset-co/sai-auth
# Запускаем все сервисы
make up
# Проверяем статус
make status
# Смотрим логи
make logsСервисы будут доступны на:
- github.com/saiset-co/sai-auth: http://localhost:8081
- SAI-Storage: http://localhost:8080
- MongoDB Express: http://localhost:8082
- API Documentation: http://localhost:8081/docs
# Установка зависимостей
make deps
# Создание конфигурации
make config
# Запуск (требует Redis и SAI-Storage)
make run- Framework: SAI Service Framework (FastHTTP)
- Database: MongoDB через SAI-Storage
- Cache: Redis для токенов и rate limiting
- Language: Go 1.21+
github.com/saiset-co/sai-auth/
├── cmd/main.go # Точка входа
├── internal/
│ ├── auth/providers/ # Auth provider для других сервисов
│ ├── handlers/ # HTTP обработчики
│ ├── middleware/ # Rate limiting middleware
│ ├── models/ # Модели данных
│ ├── repository/ # Интерфейсы репозиториев
│ ├── service/ # Бизнес логика
│ └── storage/ # MongoDB и Redis адаптеры
├── types/ # Типы конфигурации и запросов
└── docker-compose.yml # Docker окружение
POST /api/v1/auth/login- Вход в системуPOST /api/v1/auth/refresh- Обновление токенаPOST /api/v1/auth/logout- Выход из системыGET /api/v1/roles- Список ролейPOST /api/v1/roles- Создание ролиPUT /api/v1/roles- Обновление ролиDELETE /api/v1/roles- Удаление ролиGET /api/v1/roles/permissions- Скомпилированные разрешения ролиPOST /api/v1/roles/permissions- Тестирование разрешений
curl -X POST http://localhost:8081/api/v1/users \
-H "Content-Type: application/json" \
-d '{
"username": "john.doe",
"email": "john@example.com",
"password": "password123",
"data": {
"first_name": "John",
"last_name": "Doe",
"department": "IT"
}
}'curl -X POST http://localhost:8081/api/v1/roles \
-H "Content-Type: application/json" \
-d '{
"name": "content_manager",
"permissions": [
{
"microservice": "sai-storage",
"method": "GET",
"path": "/api/v1/documents",
"rates": [
{
"limit": 100,
"window": "60s"
}
],
"required_params": [
{
"param": "collection",
"any_value": ["articles", "news"]
},
{
"param": "filter.author_id",
"value": "$.internal_id"
}
],
"restricted_params": [
{
"param": "collection",
"any_value": ["users", "admin_logs"]
}
]
}
]
}'curl -X POST http://localhost:8081/api/v1/auth/login \
-H "Content-Type: application/json" \
-d '{
"username": "john.doe",
"password": "password123"
}'curl -X POST http://localhost:8081/api/v1/auth/verify \
-H "Content-Type: application/json" \
-d '{
"token": "your-access-token",
"microservice": "sai-storage",
"method": "GET",
"path": "/api/v1/documents",
"request_params": {
"collection": "articles",
"filter": {
"author_id": "user_12345",
"status": "published"
}
}
}'{
"microservice": "sai-storage",
"method": "GET",
"path": "/api/v1/documents",
"rates": [
{"limit": 100, "window": "60s"}
],
"required_params": [
{
"param": "collection",
"any_value": ["articles", "news"]
}
],
"restricted_params": [
{
"param": "collection",
"any_value": ["users", "admin_logs"]
}
]
}- value: "*" - параметр обязателен, любое значение
- value: "concrete" - конкретное значение
- value: "$.field" - подстановка из профиля пользователя
- any_value: ["val1", "val2"] - одно из значений
- all_values: ["val1", "val2"] - все значения (для массивов)
$.internal_id→ ID пользователя$.data.department→ Отдел пользователя$.data.teams→ Команды пользователя (преобразуется в any_value)
- Дочерние роли наследуют разрешения родительских
- Максимальная глубина наследования: 5 уровней
restricted_paramsимеют приоритет надrequired_params- Максимум 10 ролей на пользователя
- Максимум 50 разрешений на роль
// В main.go микросервиса
import "github.com/saiset-co/sai-auth/internal/auth/providers"
func setupAuth() {
saiAuthProvider := providers.NewSaiAuthProvider("http://github.com/saiset-co/sai-auth:8080")
// Регистрация в SAI Service
authProvider := sai.AuthProvider()
authProvider.Register("sai_auth", saiAuthProvider)
}middlewares:
auth:
enabled: true
weight: 60
params:
provider: "sai_auth"
auth_providers:
sai_auth:
params:
auth_service_url: "http://github.com/saiset-co/sai-auth:8080"
timeout: "30s"# Сервер
SERVER_HOST=0.0.0.0
SERVER_PORT=8080
# SAI Storage
STORAGE_URL=http://localhost:8080
STORAGE_USERNAME=
STORAGE_PASSWORD=
# Redis
REDIS_HOST=localhost
REDIS_PORT=6379
REDIS_PASSWORD=
REDIS_DB=0
# Аутентификация
ACCESS_TOKEN_TTL=3600s
REFRESH_TOKEN_TTL=86400s
BCRYPT_COST=12
SECRET_KEY=your-secret-key
# Суперпользователь
SUPER_USER_IP_1=127.0.0.1
SUPER_USER_IP_2=::1
# Логирование
LOG_LEVEL=infomake help # Список команд
make deps # Загрузка зависимостей
make build # Сборка приложения
make run # Запуск локально
make test # Тесты
make docker-build # Сборка Docker образа
make up # Запуск всех сервисов
make logs # Просмотр логов
make clean # Очистка- Go 1.21+
- Docker и Docker Compose
- Make
# Юнит тесты
make test
# Интеграционные тесты
make test-integration
# Покрытие кода
make test-coverage- bcrypt с cost 12
- Автоматическое хеширование при создании/обновлении пользователей
- Reference tokens с хранением в Redis
- Конфигурируемое время жизни access/refresh токенов
- Автоматическая инвалидация при logout
- Первый зарегистрированный пользователь
- Доступ ко всем сервисам без ограничений
- IP whitelist для дополнительной безопасности
- Per-user ограничения на основе разрешений ролей
- Гибкая настройка лимитов через Redis
- Поддержка multiple rate windows
curl http://localhost:8081/health- Встроенные метрики SAI Service
- Доступны на
/metrics(Prometheus format) - Memory метрики по умолчанию
- Структурированное логирование через SAI Logger
- Конфигурируемый уровень логирования
- Поддержка console и JSON форматов
- Время ответа авторизации: < 50ms (99-й перцентиль)
- Пропускная способность: > 1000 RPS на инстансе
- Кэширование: Скомпилированные разрешения в Redis
- FastHTTP для максимальной производительности
- Redis кэширование токенов и разрешений
- Компиляция разрешений при назначении ролей
- Connection pooling для MongoDB
make status
make healthmake logs # Все сервисы
make logs-auth # Только github.com/saiset-co/sai-auth
make logs-storage # Только SAI-Storage
make logs-redis # Только Redismake mongo-shell # MongoDB
make redis-cli # Redismake dev-reset # Пересоздание контейнеров
make clean-all # Полная очисткаMIT License - см. LICENSE файл для деталей.
Для вопросов и проблем создавайте issue в репозитории или обращайтесь к команде разработки./auth/me` - Информация о пользователе
POST /api/v1/auth/verify- Проверка токена (для микросервисов)
GET /api/v1/users- Список пользователейPOST /api/v1/users- Создание пользователяPUT /api/v1/users- Обновление пользователяDELETE /api/v1/users- Удаление пользователяPOST /api/v1/users/assign-roles- Назначение ролейPOST /api/v1/users/remove-roles- Удаление ролей
GET /api/v1/roles- Список ролейPOST /api/v1/roles- Создание ролиPUT /api/v1/roles- Обновление ролиDELETE /api/v1/roles- Удаление роли- `GET /api/v1