# SSO Service Self-hosted SSO / OIDC-сервис — аналог Keycloak / Яндекс ID. Node.js (NestJS). ## Технологии - **Runtime:** Node.js 22, NestJS 11 - **Database:** PostgreSQL 16 + Prisma ORM - **Cache:** Redis 7 - **Message Broker:** RabbitMQ 4 - **Logging:** Pino (JSON, nestjs-pino) - **Metrics:** Prometheus - **Security:** Argon2, JWT (Access + Refresh), Helmet, OIDC (authorization_code, PKCE) - **Templates:** EJS + Bootstrap 5 ## Возможности ### Аутентификация - Логин/пароль (Argon2) - Вход по коду на email - Вход по коду на телефон - QR-авторизация (для мобильного приложения) - Refresh + rotate токенов ### Веб-панель - `/login` — страница входа (пароль, код на email, QR) - `/register` — регистрация - `/profile` — личный кабинет (редактирование профиля) - `/admin` — админ-панель: - Статистика (пользователи, клиенты, сессии) - CRUD пользователей - CRUD OAuth-клиентов (как oauth.yandex.ru) ### Роли - **USER** — только свой профиль - **ADMIN** — управление пользователями и OAuth-клиентами ### OIDC / OAuth2 - `/authorize` (authorization_code) - `/token` (authorization_code, refresh_token, client_credentials) - `/userinfo` - `/revoke` - PKCE support ## Быстрый старт ### 1. Инфраструктура ```bash docker compose up -d ``` ### 2. База данных ```bash npx prisma db push ``` ### 3. Тестовые данные ```bash npx ts-node prisma/seed.ts ``` Создаёт: - **Admin:** `admin@sso.local` / `admin123!` - **OAuth Client:** `test-client` (секрет в консоли) ### 4. Запуск ```bash npm run start:dev ``` Сервис: `http://localhost:3000` ## API Endpoints | Method | Path | Auth | Description | |--------|------|------|-------------| | POST | /api/auth/register | No | Регистрация | | POST | /api/auth/login | No | Логин (пароль) | | POST | /api/auth/login/email-code | No | Логин (код на email) | | POST | /api/auth/login/phone-code | No | Логин (код на телефон) | | POST | /api/auth/send-email-code | No | Отправить код на email | | POST | /api/auth/send-phone-code | No | Отправить код на телефон | | POST | /api/auth/qr/init | No | Создать QR-сессию | | POST | /api/auth/qr/poll | No | Проверить QR-сессию | | POST | /api/auth/refresh | No | Обновить токен | | POST | /api/auth/logout | No | Выйти | | GET | /api/auth/profile | JWT | Профиль | | POST | /api/auth/profile/update | JWT | Обновить профиль | | GET | /api/authorize | No | OAuth2 authorize | | POST | /api/token | No | OAuth2 token | | GET | /api/userinfo | Bearer | OIDC userinfo | | POST | /api/revoke | No | Отозвать токен | | GET | /api/admin/stats | JWT+ADMIN | Статистика | | GET | /api/admin/users | JWT+ADMIN | Список пользователей | | POST | /api/admin/users | JWT+ADMIN | Создать пользователя | | PUT | /api/admin/users/:id | JWT+ADMIN | Обновить пользователя | | DELETE | /api/admin/users/:id | JWT+ADMIN | Удалить пользователя | | GET | /api/admin/clients | JWT+ADMIN | Список OAuth-клиентов | | POST | /api/admin/clients | JWT+ADMIN | Создать OAuth-клиент | | PUT | /api/admin/clients/:id | JWT+ADMIN | Обновить OAuth-клиент | | DELETE | /api/admin/clients/:id | JWT+ADMIN | Удалить OAuth-клиент | | GET | /metrics | No | Prometheus метрики | ## Веб-панель | Страница | URL | Доступ | |----------|-----|--------| | Логин | /login | Все | | Регистрация | /register | Все | | Профиль | /profile | Авторизованные | | Админка (пользователи) | /admin | ADMIN | | Админка (клиенты) | /admin/clients | ADMIN | ## Примеры cURL ### Регистрация ```bash curl -X POST http://localhost:3000/api/auth/register \ -H "Content-Type: application/json" \ -d '{"email":"user@example.com","password":"secret1234","displayName":"Test"}' ``` ### Логин по паролю ```bash curl -X POST http://localhost:3000/api/auth/login \ -H "Content-Type: application/json" \ -d '{"email":"user@example.com","password":"secret1234"}' ``` ### Логин по коду на email ```bash # Шаг 1: запросить код curl -X POST http://localhost:3000/api/auth/send-email-code \ -H "Content-Type: application/json" \ -d '{"email":"user@example.com"}' # Шаг 2: войти с кодом curl -X POST http://localhost:3000/api/auth/login/email-code \ -H "Content-Type: application/json" \ -d '{"email":"user@example.com","code":"123456"}' ``` ### QR-авторизация ```bash # Инициализация curl -X POST http://localhost:3000/api/auth/qr/init # Проверка статуса curl -X POST http://localhost:3000/api/auth/qr/poll \ -H "Content-Type: application/json" \ -d '{"sessionId":""}' ``` ### Админка (список пользователей) ```bash curl http://localhost:3000/api/admin/users \ -H "Authorization: Bearer " ``` ### Метрики ```bash curl http://localhost:3000/metrics ``` ### RabbitMQ Management ``` http://localhost:15672 Login: sso / sso_secret ``` ## Переменные окружения Скопируйте `.env.example` в `.env`: ```bash cp .env.example .env ``` Все переменные строго валидируются (Zod). Fast Fail. ## Быстрая установка одной командой ```bash curl -fsSL https://git.lendry.ru/lendry/sso-mvk/raw/main/install.sh | bash ``` Скрипт автоматически: 1. Проверяет Node.js, Docker, Docker Compose 2. Скачивает проект в `~/sso-service` 3. Создаёт `.env` со случайными JWT-секретами 4. Запускает PostgreSQL, Redis, RabbitMQ через Docker 5. Устанавливает зависимости, применяет миграции, сидирует БД 6. Собирает и запускает сервис После установки: - **Веб-панель:** http://localhost:3000 - **Админ:** `admin@sso.local` / `admin123!` - **Метрики:** http://localhost:3000/metrics - **RabbitMQ UI:** http://localhost:15672 (`sso` / `sso_secret`) ### Переменные окружения (опционально) ```bash INSTALL_DIR=/opt/sso curl -fsSL https://github.com/ssomvk/sso-service/raw/main/install.sh | bash ``` ## Ручная установка ```bash # 1. Клонировать git clone https://github.com/ssomvk/sso-service.git cd sso-service # 2. Настроить окружение cp .env.example .env # Отредактировать .env под себя # 3. Запустить инфраструктуру docker compose up -d # 4. Установить зависимости и применить миграции npm ci npx prisma generate npx prisma db push npx ts-node prisma/seed.ts # 5. Собрать и запустить npm run build node dist/main ``` ## Production-деплой ```bash npm run build node dist/main ``` Корректно обрабатывает X-Forwarded-For (TRUST_PROXY). ## Публикация на GitHub ```bash # 1. Создать репозиторий на github.com → New repository # Название: sso-service (или любое другое) # Visibility: Public # 2. Инициализировать git и запушить cd sso-service git init git add -A git commit -m "Initial commit: SSO service (NestJS, Prisma 7, PostgreSQL)" git branch -M main git remote add origin https://github.com/ВАШ_ЛОГИН/sso-service.git git push -u origin main # 3. Установка с любого сервера: curl -fsSL https://github.com/ВАШ_ЛОГИН/sso-service/raw/main/install.sh | bash ``` **Важно:** Перед пушем отредактируйте `install.sh` — замените `REPO="ssomvk/sso-service"` на ваш репозиторий (строка 4).