- 🚨 **Critical Fix**: Исправлена критическая ошибка OAuth маршрутизации - использование HTTP handlers вместо GraphQL функций
All checks were successful
Deploy on push / deploy (push) Successful in 10m8s

- 🔒 **OAuth X/Twitter**: Добавлены обязательные scope `tweet.read users.read`
- 🔒 **OAuth Yandex**: Добавлены scope `login:email login:info login:avatar`
- 🔒 **OAuth Telegram**: Добавлен недостающий access_token_url и scope
- 📚 **OAuth Documentation**: Обновлена документация для всех провайдеров с актуальными настройками и требованиями
This commit is contained in:
2025-09-23 17:14:47 +03:00
parent d87c0c522c
commit 408749f34d
4 changed files with 106 additions and 12 deletions

View File

@@ -14,6 +14,11 @@
- 🔒 **OAuth X/Twitter**: Исправлен endpoint с `authors/me` на `users/me`
- 🔒 **Session Cookies**: Автоматическое определение HTTPS через переменную окружения HTTPS_ENABLED
- 🏷️ **Type Safety**: Исправлена ошибка в OAuth регистрации провайдеров
- 🚨 **Critical Fix**: Исправлена критическая ошибка OAuth маршрутизации - использование HTTP handlers вместо GraphQL функций
- 🔒 **OAuth X/Twitter**: Добавлены обязательные scope `tweet.read users.read`
- 🔒 **OAuth Yandex**: Добавлены scope `login:email login:info login:avatar`
- 🔒 **OAuth Telegram**: Добавлен недостающий access_token_url и scope
- 📚 **OAuth Documentation**: Обновлена документация для всех провайдеров с актуальными настройками и требованиями
## [0.9.21] - 2025-09-21

View File

@@ -100,10 +100,17 @@ PROVIDER_CONFIGS = {
"access_token_url": "https://api.twitter.com/2/oauth2/token",
"authorize_url": "https://twitter.com/i/oauth2/authorize",
"api_base_url": "https://api.twitter.com/2/",
"client_kwargs": {
"scope": "tweet.read users.read", # Базовые scope для X API v2
},
},
"telegram": {
"access_token_url": "https://oauth.telegram.org/auth/request",
"authorize_url": "https://oauth.telegram.org/auth",
"api_base_url": "https://api.telegram.org/",
"client_kwargs": {
"scope": "read", # Базовый scope для Telegram
},
},
"vk": {
"access_token_url": "https://oauth.vk.com/access_token",
@@ -117,6 +124,9 @@ PROVIDER_CONFIGS = {
"access_token_url": "https://oauth.yandex.ru/token",
"authorize_url": "https://oauth.yandex.ru/authorize",
"api_base_url": "https://login.yandex.ru/info",
"client_kwargs": {
"scope": "login:email login:info login:avatar", # Scope для получения профиля
},
},
}

View File

@@ -7,13 +7,13 @@
## 🚀 Быстрый старт
### Поддерживаемые провайдеры
- **Google** - OpenID Connect
- **GitHub** - OAuth 2.0
- **Facebook** - Facebook Login
- **VK** - VK OAuth
- **Yandex** - Yandex OAuth
- **X (Twitter)** - OAuth 2.0
- **Telegram** - Telegram Login
- **Google** - OpenID Connect (актуальные endpoints)
- **GitHub** - OAuth 2.0 (scope: read:user user:email)
- **Facebook** - Facebook Login API v18.0+ (scope: email public_profile)
- **VK** - VK OAuth API v5.199+ (scope: email)
- **X (Twitter)** ✅ - OAuth 2.0 API v2 (scope: tweet.read users.read)
- **Yandex** ✅ - Yandex OAuth (scope: login:email login:info login:avatar)
- **Telegram** ⚠️ - Telegram Login (специфическая реализация)
### Redis структура
```bash
@@ -215,9 +215,25 @@ VK_OAUTH_CONFIG = {
- Scope `email` необходим для получения email адреса
- Redirect URI должен **точно совпадать** с настройками в приложении VK
- Поддерживаются только HTTPS redirect URI в production
### X (Twitter) OAuth
```python
X_OAUTH_CONFIG = {
"client_id": os.getenv("X_CLIENT_ID"),
"client_secret": os.getenv("X_CLIENT_SECRET"),
"auth_url": "https://twitter.com/i/oauth2/authorize",
"token_url": "https://api.twitter.com/2/oauth2/token",
"user_info_url": "https://api.twitter.com/2/users/me",
"scope": "tweet.read users.read"
}
```
**⚠️ Важные требования X:**
- Используйте **API v2** endpoints
- Scope `users.read` обязателен для получения профиля
- Email недоступен через публичное API
- Требуется верификация приложения для production
### Yandex OAuth
```python
YANDEX_OAUTH_CONFIG = {
@@ -226,10 +242,32 @@ YANDEX_OAUTH_CONFIG = {
"auth_url": "https://oauth.yandex.ru/authorize",
"token_url": "https://oauth.yandex.ru/token",
"user_info_url": "https://login.yandex.ru/info",
"scope": "login:email login:info"
"scope": "login:email login:info login:avatar"
}
```
**⚠️ Важные требования Yandex:**
- Scope `login:email` для получения email
- Scope `login:info` для базовой информации профиля
- Scope `login:avatar` для получения аватара
- Поддержка только HTTPS redirect URI
### Telegram OAuth
```python
TELEGRAM_OAUTH_CONFIG = {
"client_id": os.getenv("TELEGRAM_CLIENT_ID"),
"client_secret": os.getenv("TELEGRAM_CLIENT_SECRET"),
"auth_url": "https://oauth.telegram.org/auth",
"token_url": "https://oauth.telegram.org/auth/request",
"scope": "read"
}
```
**⚠️ Важные требования Telegram:**
- Специальная настройка через @BotFather
- Email недоступен - используется временный email
- Получение номера телефона требует дополнительных разрешений
## 🔒 Безопасность
### TTL и истечение токенов
@@ -347,10 +385,21 @@ FACEBOOK_APP_SECRET=your_facebook_app_secret
VK_APP_ID=your_vk_app_id
VK_APP_SECRET=your_vk_app_secret
# X (Twitter) OAuth
X_CLIENT_ID=your_x_client_id
X_CLIENT_SECRET=your_x_client_secret
# Yandex OAuth
YANDEX_CLIENT_ID=your_yandex_client_id
YANDEX_CLIENT_SECRET=your_yandex_client_secret
# Telegram OAuth
TELEGRAM_CLIENT_ID=your_telegram_client_id
TELEGRAM_CLIENT_SECRET=your_telegram_client_secret
# HTTPS настройки
HTTPS_ENABLED=true # false для разработки
# Redis для state management
REDIS_URL=redis://localhost:6379/0
@@ -382,7 +431,37 @@ JWT_EXPIRATION_HOURS=24
2. Создать новое приложение
3. Добавить продукт "Facebook Login"
4. Настроить Valid OAuth Redirect URIs:
- `https://your-domain.com/auth/oauth/facebook/callback`
- `https://your-domain.com/oauth/facebook/callback`
5. Переключить приложение в режим "Live"
#### X (Twitter) OAuth
1. Перейти в [Twitter Developer Portal](https://developer.twitter.com/en/portal/dashboard)
2. Создать новое приложение
3. Настроить OAuth 2.0 settings
4. Добавить Callback URLs:
- `https://your-domain.com/oauth/x/callback`
5. Получить Client ID и Client Secret
#### VK OAuth
1. Перейти в [VK Developers](https://vk.com/dev)
2. Создать новое приложение типа "Веб-сайт"
3. Настроить "Доверенный redirect URI":
- `https://your-domain.com/oauth/vk/callback`
4. Получить ID приложения и Защищённый ключ
#### Yandex OAuth
1. Перейти в [Yandex OAuth](https://oauth.yandex.ru/)
2. Создать новое приложение
3. Настроить Callback URL:
- `https://your-domain.com/oauth/yandex/callback`
4. Выбрать необходимые права доступа
5. Получить ID и пароль приложения
#### Telegram OAuth
1. Создать бота через @BotFather
2. Получить Bot Token
3. Настроить OAuth через Telegram API
4. **Внимание**: Telegram OAuth имеет специфическую реализацию
### Redis команды для отладки
```bash

View File

@@ -18,7 +18,7 @@ from starlette.staticfiles import StaticFiles
from auth.handler import EnhancedGraphQLHTTPHandler
from auth.middleware import AuthMiddleware, auth_middleware
from auth.oauth import oauth_callback, oauth_login
from auth.oauth import oauth_callback_http, oauth_login_http
from cache.precache import precache_data
from cache.revalidator import revalidation_manager
from rbac import initialize_rbac
@@ -303,8 +303,8 @@ app = Starlette(
routes=[
Route("/graphql", graphql_handler, methods=["GET", "POST", "OPTIONS"]),
# OAuth маршруты
Route("/oauth/{provider}", oauth_login, methods=["GET"]),
Route("/oauth/{provider}/callback", oauth_callback, methods=["GET"]),
Route("/oauth/{provider}", oauth_login_http, methods=["GET"]),
Route("/oauth/{provider}/callback", oauth_callback_http, methods=["GET"]),
# Health check endpoint
Route("/health", health_handler, methods=["GET"]),
# Статические файлы (CSS, JS, изображения)