From 26f28aa35e352b23aab096a58ae7d8a406b356d4 Mon Sep 17 00:00:00 2001 From: Untone Date: Wed, 24 Sep 2025 09:33:02 +0300 Subject: [PATCH] [0.9.23] - 2025-09-23 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ### Fixed - 🔧 **OAuth Callback URL**: Исправлено формирование callback URL - добавлен отсутствующий слеш между доменом и путем - 🔒 **OAuth HTTPS**: Принудительное использование HTTPS для callback URL в продакшне (исправляет ошибку "redirect_uri is not associated") ### Changed - 🔄 **OAuth Routes**: Возвращены к стандартному формату `/oauth/{provider}` - провайдеры не передают параметр provider в callback --- CHANGELOG.md | 3 ++- auth/oauth.py | 12 ++++++++---- docs/oauth-setup.md | 16 +++++++++------- 3 files changed, 19 insertions(+), 12 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b4faa659..db1a47ab 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,9 +1,10 @@ # Changelog -## [0.9.23] - 2025-09-23 +## [0.9.23] - 2025-09-24 ### Fixed - 🔧 **OAuth Callback URL**: Исправлено формирование callback URL - добавлен отсутствующий слеш между доменом и путем +- 🔒 **OAuth HTTPS**: Принудительное использование HTTPS для callback URL в продакшне (исправляет ошибку "redirect_uri is not associated") ### Changed - 🔄 **OAuth Routes**: Возвращены к стандартному формату `/oauth/{provider}` - провайдеры не передают параметр provider в callback diff --git a/auth/oauth.py b/auth/oauth.py index 338dfb5f..e0014312 100644 --- a/auth/oauth.py +++ b/auth/oauth.py @@ -407,8 +407,11 @@ async def oauth_login(_: None, _info: GraphQLResolveInfo, provider: str, callbac } await store_oauth_state(state, oauth_data) - # Callback должен идти на backend, получаем из base_url (который должен быть backend URL) - oauth_callback_uri = f"{callback_data['base_url'].rstrip('/')}/oauth/{provider}/callback" + # Callback должен идти на backend с принудительным HTTPS для продакшна + base_url = callback_data["base_url"].rstrip("/") + # Принудительно HTTPS + base_url = base_url.replace("http://", "https://") + oauth_callback_uri = f"{base_url}/oauth/{provider}/callback" try: return await client.authorize_redirect( @@ -547,8 +550,9 @@ async def oauth_login_http(request: Request) -> JSONResponse | RedirectResponse: } await store_oauth_state(state, oauth_data) - # Получаем backend URL из request - backend_url = request.url.scheme + "://" + request.url.netloc + # Получаем backend URL из request (принудительно HTTPS для продакшна) + scheme = "https" if request.url.netloc != "localhost:8000" else request.url.scheme + backend_url = f"{scheme}://{request.url.netloc}" callback_uri = f"{backend_url}/oauth/{provider}/callback" # 🔍 Создаем redirect URL вручную (обходим использование request.session в authlib) diff --git a/docs/oauth-setup.md b/docs/oauth-setup.md index 55d371a6..d330c1f0 100644 --- a/docs/oauth-setup.md +++ b/docs/oauth-setup.md @@ -24,8 +24,8 @@ 3. **APIs & Services** → **Credentials** → **Create Credentials** → **OAuth 2.0 Client ID** 4. **Application type**: Web application 5. **Authorized redirect URIs**: - - `https://v3.dscrs.site/oauth/google/callback` - - `http://localhost:3000/oauth/google/callback` (для разработки) + - `https://v3.dscrs.site/oauth/google/callback` ⚠️ **ОБЯЗАТЕЛЬНО HTTPS** + - `http://localhost:8000/oauth/google/callback` (для разработки) 6. Скопировать **Client ID** и **Client Secret** **Переменные окружения:** @@ -38,7 +38,7 @@ GOOGLE_CLIENT_SECRET=your_google_client_secret 1. Перейти в [GitHub Developer Settings](https://github.com/settings/developers) 2. **New OAuth App** -3. **Authorization callback URL**: `https://v3.dscrs.site/oauth/github/callback` +3. **Authorization callback URL**: `https://v3.dscrs.site/oauth/github/callback` ⚠️ **ОБЯЗАТЕЛЬНО HTTPS** 4. Скопировать **Client ID** и **Client Secret** **Переменные окружения:** @@ -51,7 +51,7 @@ GITHUB_CLIENT_SECRET=your_github_client_secret 1. Перейти в [VK Developers](https://dev.vk.com/apps) 2. **Создать приложение** → **Веб-сайт** -3. **Настройки** → **Redirect URI**: `https://v3.dscrs.site/oauth/vk/callback` +3. **Настройки** → **Redirect URI**: `https://v3.dscrs.site/oauth/vk/callback` ⚠️ **ОБЯЗАТЕЛЬНО HTTPS** 4. Скопировать **ID приложения** и **Защищённый ключ** **Переменные окружения:** @@ -65,7 +65,7 @@ VK_CLIENT_SECRET=your_vk_secure_key 1. Перейти в [Facebook Developers](https://developers.facebook.com/) 2. **My Apps** → **Create App** → **Consumer** 3. **Facebook Login** → **Settings** -4. **Valid OAuth Redirect URIs**: `https://v3.dscrs.site/oauth/facebook/callback` +4. **Valid OAuth Redirect URIs**: `https://v3.dscrs.site/oauth/facebook/callback` ⚠️ **ОБЯЗАТЕЛЬНО HTTPS** 5. Скопировать **App ID** и **App Secret** **Переменные окружения:** @@ -78,7 +78,7 @@ FACEBOOK_CLIENT_SECRET=your_facebook_app_secret 1. Перейти в [Yandex OAuth](https://oauth.yandex.ru/) 2. **Создать новое приложение** -3. **Callback URI**: `https://v3.dscrs.site/oauth/yandex/callback` +3. **Callback URI**: `https://v3.dscrs.site/oauth/yandex/callback` ⚠️ **ОБЯЗАТЕЛЬНО HTTPS** 4. **Права**: `login:info`, `login:email`, `login:avatar` 5. Скопировать **ID** и **Пароль** @@ -127,8 +127,10 @@ heroku config:set GOOGLE_CLIENT_ID=xxx GOOGLE_CLIENT_SECRET=yyy - **ВАЖНО**: Callback URL должен указывать на backend (`v3.dscrs.site`), НЕ на frontend (`testing.discours.io`) **Ошибка "redirect_uri is not associated with this application":** -- Callback URL в настройках провайдера должен быть `v3.dscrs.site/oauth/{provider}/callback` +- Callback URL в настройках провайдера должен быть `https://v3.dscrs.site/oauth/{provider}/callback` +- **ОБЯЗАТЕЛЬНО HTTPS** (не HTTP) для продакшна - НЕ указывать frontend URL в настройках провайдера +- Проверить что URL в настройках GitHub **точно совпадает** с тем что отправляет код **VK ошибка "Code challenge method is unsupported":** - Это нормально, VK не поддерживает PKCE