- 🚨 **Critical Fix**: Исправлена критическая ошибка OAuth маршрутизации - использование HTTP handlers вместо GraphQL функций
All checks were successful
Deploy on push / deploy (push) Successful in 10m8s
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:
@@ -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
|
||||
|
||||
|
||||
@@ -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 для получения профиля
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
6
main.py
6
main.py
@@ -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, изображения)
|
||||
|
||||
Reference in New Issue
Block a user