235 lines
8.3 KiB
Markdown
235 lines
8.3 KiB
Markdown
# 🔐 Настройка OpenID Connect
|
||
|
||
## Что добавлено
|
||
|
||
### Поддержка OpenID Connect провайдеров
|
||
MC Panel теперь поддерживает вход через ZITADEL:
|
||
- 🔐 **ZITADEL** - Современная платформа управления идентификацией и доступом
|
||
|
||
## 📋 Требования
|
||
|
||
### Установка зависимостей
|
||
```bash
|
||
cd backend
|
||
pip install authlib==1.3.0 httpx==0.26.0
|
||
```
|
||
|
||
Или установите все зависимости:
|
||
```bash
|
||
cd backend
|
||
pip install -r requirements.txt
|
||
```
|
||
|
||
Новые зависимости:
|
||
- `authlib==1.3.0` - OAuth2/OpenID Connect клиент
|
||
- `httpx==0.26.0` - HTTP клиент для API запросов
|
||
|
||
**Важно:** В authlib 1.3.0 используется `authlib.integrations.starlette_client` (FastAPI основан на Starlette)
|
||
|
||
## ⚙️ Настройка ZITADEL
|
||
|
||
### 1. Создание проекта в ZITADEL
|
||
|
||
#### Шаг 1: Регистрация в ZITADEL
|
||
1. Перейдите на [ZITADEL Cloud](https://zitadel.cloud/) или используйте свой self-hosted инстанс
|
||
2. Создайте новый проект или используйте существующий
|
||
3. Запомните URL вашего инстанса (например: `https://your-instance.zitadel.cloud`)
|
||
|
||
#### Шаг 2: Создание приложения
|
||
1. В проекте нажмите "New Application"
|
||
2. Выберите тип: **Web Application**
|
||
3. Выберите метод аутентификации: **Code (with PKCE)**
|
||
4. Укажите название: `MC Panel`
|
||
|
||
#### Шаг 3: Настройка Redirect URIs
|
||
Добавьте следующие redirect URIs:
|
||
- Для разработки: `http://localhost:8000/api/auth/oidc/zitadel/callback`
|
||
- Для продакшена: `https://your-domain.com/api/auth/oidc/zitadel/callback`
|
||
|
||
#### Шаг 4: Получение учётных данных
|
||
После создания приложения вы получите:
|
||
- **Client ID** - идентификатор приложения
|
||
- **Client Secret** - секретный ключ (сохраните его!)
|
||
- **Issuer URL** - URL вашего ZITADEL инстанса
|
||
|
||
### 2. Настройка в .env
|
||
|
||
Создайте или отредактируйте файл `backend/.env`:
|
||
|
||
```bash
|
||
# Базовые настройки
|
||
SECRET_KEY=your-secret-key-here-change-this-in-production
|
||
BASE_URL=http://localhost:8000
|
||
FRONTEND_URL=http://localhost:3000
|
||
|
||
# ZITADEL Configuration
|
||
ZITADEL_ISSUER=https://your-instance.zitadel.cloud
|
||
ZITADEL_CLIENT_ID=your-client-id@your-project
|
||
ZITADEL_CLIENT_SECRET=your-client-secret
|
||
```
|
||
|
||
### 3. Пример настройки
|
||
|
||
```bash
|
||
# Пример для ZITADEL Cloud
|
||
ZITADEL_ISSUER=https://mc-panel-abc123.zitadel.cloud
|
||
ZITADEL_CLIENT_ID=123456789012345678@mc-panel
|
||
ZITADEL_CLIENT_SECRET=abcdefghijklmnopqrstuvwxyz1234567890ABCDEFGH
|
||
```
|
||
|
||
## 🚀 Запуск
|
||
|
||
### 1. Создайте .env файл
|
||
```bash
|
||
cd backend
|
||
cp .env.example .env
|
||
```
|
||
|
||
### 2. Настройте ZITADEL
|
||
Отредактируйте `.env` файл:
|
||
```bash
|
||
# Базовые настройки
|
||
SECRET_KEY=your-secret-key-here-change-this-in-production
|
||
BASE_URL=http://localhost:8000
|
||
FRONTEND_URL=http://localhost:3000
|
||
|
||
# ZITADEL
|
||
ZITADEL_ISSUER=https://your-instance.zitadel.cloud
|
||
ZITADEL_CLIENT_ID=your-client-id@your-project
|
||
ZITADEL_CLIENT_SECRET=your-client-secret
|
||
```
|
||
|
||
### 3. Запустите сервер
|
||
```bash
|
||
cd backend
|
||
python main.py
|
||
```
|
||
|
||
### 4. Запустите фронтенд
|
||
```bash
|
||
cd frontend
|
||
npm run dev
|
||
```
|
||
|
||
## 🎨 Интерфейс
|
||
|
||
### Страница входа
|
||
- Обычная форма входа (логин/пароль)
|
||
- Разделитель "Или войдите через"
|
||
- Кнопка ZITADEL с иконкой 🔐 и фиолетовым цветом
|
||
- Автоматическое скрытие кнопки если ZITADEL не настроен
|
||
|
||
## 🔧 Как это работает
|
||
|
||
### 1. Пользователь нажимает кнопку провайдера
|
||
```
|
||
GET /api/auth/oidc/{provider}/login
|
||
```
|
||
|
||
### 2. Перенаправление на провайдера
|
||
Пользователь перенаправляется на страницу авторизации провайдера
|
||
|
||
### 3. Callback от провайдера
|
||
```
|
||
GET /api/auth/oidc/{provider}/callback?code=...
|
||
```
|
||
|
||
### 4. Получение токена и данных пользователя
|
||
- Обмен code на access_token
|
||
- Получение информации о пользователе
|
||
- Создание или обновление пользователя в системе
|
||
|
||
### 5. Создание JWT токена
|
||
- Генерация JWT токена для пользователя
|
||
- Перенаправление на фронтенд с токеном
|
||
|
||
### 6. Автоматический вход
|
||
- Фронтенд получает токен из URL
|
||
- Сохраняет токен в localStorage
|
||
- Пользователь автоматически входит в систему
|
||
|
||
## 👥 Управление пользователями
|
||
|
||
### Автоматическое создание пользователей
|
||
При первом входе через OpenID Connect:
|
||
- Создаётся новый пользователь
|
||
- Роль: "user" (обычный пользователь)
|
||
- Username генерируется из email или имени
|
||
- Сохраняется связь с провайдером
|
||
|
||
### Данные пользователя
|
||
```json
|
||
{
|
||
"username": "john_doe",
|
||
"password": "",
|
||
"role": "user",
|
||
"servers": [],
|
||
"oidc_id": "zitadel:123456789012345678",
|
||
"email": "john@example.com",
|
||
"name": "John Doe",
|
||
"picture": "https://avatar.url",
|
||
"provider": "zitadel",
|
||
"created_at": "2026-01-15T12:00:00"
|
||
}
|
||
```
|
||
|
||
### Повторные входы
|
||
- Пользователь находится по `oidc_id`
|
||
- Обновляется email, имя и аватар
|
||
- Роль и серверы сохраняются
|
||
|
||
## 🔐 Безопасность
|
||
|
||
### Проверки
|
||
- Проверка state параметра (CSRF защита)
|
||
- Проверка redirect_uri
|
||
- Валидация токенов от провайдеров
|
||
- Проверка подписи JWT токенов
|
||
|
||
### Рекомендации
|
||
- Используйте HTTPS в продакшене
|
||
- Регулярно обновляйте client secrets
|
||
- Ограничьте redirect URIs
|
||
- Мониторьте подозрительную активность
|
||
|
||
## 🚨 Troubleshooting
|
||
|
||
### Ошибка "Provider not found"
|
||
- Проверьте настройки в .env файле
|
||
- Убедитесь что CLIENT_ID указан
|
||
- Перезапустите сервер
|
||
|
||
### Ошибка "Invalid redirect_uri"
|
||
- Проверьте redirect URI в настройках провайдера
|
||
- Должен точно совпадать с `BASE_URL/api/auth/oidc/{provider}/callback`
|
||
|
||
### Ошибка "Invalid client"
|
||
- Проверьте CLIENT_ID и CLIENT_SECRET
|
||
- Убедитесь что приложение активно у провайдера
|
||
|
||
### Пользователь не создаётся
|
||
- Проверьте логи сервера
|
||
- Убедитесь что провайдер возвращает email
|
||
- Проверьте права на запись в users.json
|
||
|
||
## ✅ Готово!
|
||
|
||
OpenID Connect с ZITADEL настроен и готов к использованию. Пользователи могут входить через:
|
||
- Обычную форму (логин/пароль)
|
||
- ZITADEL (OpenID Connect)
|
||
|
||
### Тестирование
|
||
1. Настройте ZITADEL в .env файле
|
||
2. Перезапустите сервер
|
||
3. Откройте страницу входа
|
||
4. Увидите кнопку "Войти через ZITADEL"
|
||
5. Нажмите на кнопку и войдите через ZITADEL
|
||
|
||
### Преимущества ZITADEL
|
||
- ✅ Полная поддержка OpenID Connect
|
||
- ✅ Современный интерфейс управления
|
||
- ✅ Поддержка многофакторной аутентификации
|
||
- ✅ Self-hosted или Cloud решение
|
||
- ✅ Бесплатный план для небольших проектов
|
||
|
||
**Удобного использования! 🔐** |