- 🚨 **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`
|
- 🔒 **OAuth X/Twitter**: Исправлен endpoint с `authors/me` на `users/me`
|
||||||
- 🔒 **Session Cookies**: Автоматическое определение HTTPS через переменную окружения HTTPS_ENABLED
|
- 🔒 **Session Cookies**: Автоматическое определение HTTPS через переменную окружения HTTPS_ENABLED
|
||||||
- 🏷️ **Type Safety**: Исправлена ошибка в OAuth регистрации провайдеров
|
- 🏷️ **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
|
## [0.9.21] - 2025-09-21
|
||||||
|
|
||||||
|
|||||||
@@ -100,10 +100,17 @@ PROVIDER_CONFIGS = {
|
|||||||
"access_token_url": "https://api.twitter.com/2/oauth2/token",
|
"access_token_url": "https://api.twitter.com/2/oauth2/token",
|
||||||
"authorize_url": "https://twitter.com/i/oauth2/authorize",
|
"authorize_url": "https://twitter.com/i/oauth2/authorize",
|
||||||
"api_base_url": "https://api.twitter.com/2/",
|
"api_base_url": "https://api.twitter.com/2/",
|
||||||
|
"client_kwargs": {
|
||||||
|
"scope": "tweet.read users.read", # Базовые scope для X API v2
|
||||||
|
},
|
||||||
},
|
},
|
||||||
"telegram": {
|
"telegram": {
|
||||||
|
"access_token_url": "https://oauth.telegram.org/auth/request",
|
||||||
"authorize_url": "https://oauth.telegram.org/auth",
|
"authorize_url": "https://oauth.telegram.org/auth",
|
||||||
"api_base_url": "https://api.telegram.org/",
|
"api_base_url": "https://api.telegram.org/",
|
||||||
|
"client_kwargs": {
|
||||||
|
"scope": "read", # Базовый scope для Telegram
|
||||||
|
},
|
||||||
},
|
},
|
||||||
"vk": {
|
"vk": {
|
||||||
"access_token_url": "https://oauth.vk.com/access_token",
|
"access_token_url": "https://oauth.vk.com/access_token",
|
||||||
@@ -117,6 +124,9 @@ PROVIDER_CONFIGS = {
|
|||||||
"access_token_url": "https://oauth.yandex.ru/token",
|
"access_token_url": "https://oauth.yandex.ru/token",
|
||||||
"authorize_url": "https://oauth.yandex.ru/authorize",
|
"authorize_url": "https://oauth.yandex.ru/authorize",
|
||||||
"api_base_url": "https://login.yandex.ru/info",
|
"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
|
- **Google** ✅ - OpenID Connect (актуальные endpoints)
|
||||||
- **GitHub** - OAuth 2.0
|
- **GitHub** ✅ - OAuth 2.0 (scope: read:user user:email)
|
||||||
- **Facebook** - Facebook Login
|
- **Facebook** ✅ - Facebook Login API v18.0+ (scope: email public_profile)
|
||||||
- **VK** - VK OAuth
|
- **VK** ✅ - VK OAuth API v5.199+ (scope: email)
|
||||||
- **Yandex** - Yandex OAuth
|
- **X (Twitter)** ✅ - OAuth 2.0 API v2 (scope: tweet.read users.read)
|
||||||
- **X (Twitter)** - OAuth 2.0
|
- **Yandex** ✅ - Yandex OAuth (scope: login:email login:info login:avatar)
|
||||||
- **Telegram** - Telegram Login
|
- **Telegram** ⚠️ - Telegram Login (специфическая реализация)
|
||||||
|
|
||||||
### Redis структура
|
### Redis структура
|
||||||
```bash
|
```bash
|
||||||
@@ -215,9 +215,25 @@ VK_OAUTH_CONFIG = {
|
|||||||
- Scope `email` необходим для получения email адреса
|
- Scope `email` необходим для получения email адреса
|
||||||
- Redirect URI должен **точно совпадать** с настройками в приложении VK
|
- Redirect URI должен **точно совпадать** с настройками в приложении VK
|
||||||
- Поддерживаются только HTTPS redirect URI в production
|
- Поддерживаются только 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
|
### Yandex OAuth
|
||||||
```python
|
```python
|
||||||
YANDEX_OAUTH_CONFIG = {
|
YANDEX_OAUTH_CONFIG = {
|
||||||
@@ -226,10 +242,32 @@ YANDEX_OAUTH_CONFIG = {
|
|||||||
"auth_url": "https://oauth.yandex.ru/authorize",
|
"auth_url": "https://oauth.yandex.ru/authorize",
|
||||||
"token_url": "https://oauth.yandex.ru/token",
|
"token_url": "https://oauth.yandex.ru/token",
|
||||||
"user_info_url": "https://login.yandex.ru/info",
|
"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 и истечение токенов
|
### TTL и истечение токенов
|
||||||
@@ -347,10 +385,21 @@ FACEBOOK_APP_SECRET=your_facebook_app_secret
|
|||||||
VK_APP_ID=your_vk_app_id
|
VK_APP_ID=your_vk_app_id
|
||||||
VK_APP_SECRET=your_vk_app_secret
|
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 OAuth
|
||||||
YANDEX_CLIENT_ID=your_yandex_client_id
|
YANDEX_CLIENT_ID=your_yandex_client_id
|
||||||
YANDEX_CLIENT_SECRET=your_yandex_client_secret
|
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 для state management
|
||||||
REDIS_URL=redis://localhost:6379/0
|
REDIS_URL=redis://localhost:6379/0
|
||||||
|
|
||||||
@@ -382,7 +431,37 @@ JWT_EXPIRATION_HOURS=24
|
|||||||
2. Создать новое приложение
|
2. Создать новое приложение
|
||||||
3. Добавить продукт "Facebook Login"
|
3. Добавить продукт "Facebook Login"
|
||||||
4. Настроить Valid OAuth Redirect URIs:
|
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 команды для отладки
|
### Redis команды для отладки
|
||||||
```bash
|
```bash
|
||||||
|
|||||||
6
main.py
6
main.py
@@ -18,7 +18,7 @@ from starlette.staticfiles import StaticFiles
|
|||||||
|
|
||||||
from auth.handler import EnhancedGraphQLHTTPHandler
|
from auth.handler import EnhancedGraphQLHTTPHandler
|
||||||
from auth.middleware import AuthMiddleware, auth_middleware
|
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.precache import precache_data
|
||||||
from cache.revalidator import revalidation_manager
|
from cache.revalidator import revalidation_manager
|
||||||
from rbac import initialize_rbac
|
from rbac import initialize_rbac
|
||||||
@@ -303,8 +303,8 @@ app = Starlette(
|
|||||||
routes=[
|
routes=[
|
||||||
Route("/graphql", graphql_handler, methods=["GET", "POST", "OPTIONS"]),
|
Route("/graphql", graphql_handler, methods=["GET", "POST", "OPTIONS"]),
|
||||||
# OAuth маршруты
|
# OAuth маршруты
|
||||||
Route("/oauth/{provider}", oauth_login, methods=["GET"]),
|
Route("/oauth/{provider}", oauth_login_http, methods=["GET"]),
|
||||||
Route("/oauth/{provider}/callback", oauth_callback, methods=["GET"]),
|
Route("/oauth/{provider}/callback", oauth_callback_http, methods=["GET"]),
|
||||||
# Health check endpoint
|
# Health check endpoint
|
||||||
Route("/health", health_handler, methods=["GET"]),
|
Route("/health", health_handler, methods=["GET"]),
|
||||||
# Статические файлы (CSS, JS, изображения)
|
# Статические файлы (CSS, JS, изображения)
|
||||||
|
|||||||
Reference in New Issue
Block a user