diff --git a/auth/oauth.py b/auth/oauth.py index e3e35634..338dfb5f 100644 --- a/auth/oauth.py +++ b/auth/oauth.py @@ -407,7 +407,7 @@ async def oauth_login(_: None, _info: GraphQLResolveInfo, provider: str, callbac } await store_oauth_state(state, oauth_data) - # Используем URL из фронтенда для callback - для фронтенда (добавляем слеш если его нет) + # Callback должен идти на backend, получаем из base_url (который должен быть backend URL) oauth_callback_uri = f"{callback_data['base_url'].rstrip('/')}/oauth/{provider}/callback" try: @@ -537,16 +537,19 @@ async def oauth_login_http(request: Request) -> JSONResponse | RedirectResponse: state = token_urlsafe(32) # 🔍 Сохраняем состояние OAuth только в Redis (убираем зависимость от request.session) + # Получаем redirect_uri из query параметров или используем FRONTEND_URL по умолчанию + final_redirect_uri = request.query_params.get("redirect_uri", FRONTEND_URL) oauth_data = { "code_verifier": code_verifier, "provider": provider, - "redirect_uri": FRONTEND_URL, + "redirect_uri": final_redirect_uri, "created_at": int(time.time()), } await store_oauth_state(state, oauth_data) - # URL для callback - для фронтенда (добавляем слеш если его нет) - callback_uri = f"{FRONTEND_URL.rstrip('/')}/oauth/{provider}/callback" + # Получаем backend URL из request + backend_url = request.url.scheme + "://" + request.url.netloc + callback_uri = f"{backend_url}/oauth/{provider}/callback" # 🔍 Создаем redirect URL вручную (обходим использование request.session в authlib) # VK не поддерживает PKCE, используем code_challenge только для поддерживающих провайдеров diff --git a/docs/oauth-setup.md b/docs/oauth-setup.md index 1d3b1bea..55d371a6 100644 --- a/docs/oauth-setup.md +++ b/docs/oauth-setup.md @@ -1,6 +1,21 @@ # 🔐 Настройка OAuth Провайдеров -## 🎯 Быстрая настройка для менеджера +## 🎯 Архитектура OAuth + +**Важно понимать разделение:** +- **Frontend**: `testing.discours.io` - где пользователь нажимает кнопку входа +- **Backend**: `v3.dscrs.site` - где обрабатывается OAuth логика +- **Callback URL**: Всегда должен указывать на **backend** (`v3.dscrs.site`) + +## 🔄 OAuth Flow (пошагово): + +1. Пользователь на `testing.discours.io` нажимает "Войти через GitHub" +2. Фронтенд редиректит на `v3.dscrs.site/oauth/github` +3. Backend редиректит на `github.com` с callback_uri=`v3.dscrs.site/oauth/github/callback` +4. GitHub после авторизации редиректит на `v3.dscrs.site/oauth/github/callback` +5. Backend обрабатывает callback и редиректит обратно на `testing.discours.io` + +## 🎯 Быстрая настройка ### 1. Google OAuth @@ -109,6 +124,11 @@ heroku config:set GOOGLE_CLIENT_ID=xxx GOOGLE_CLIENT_SECRET=yyy **Ошибка redirect_uri_mismatch:** - Проверить точное соответствие URL в настройках провайдера - Убедиться что протокол (http/https) совпадает +- **ВАЖНО**: 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` +- НЕ указывать frontend URL в настройках провайдера **VK ошибка "Code challenge method is unsupported":** - Это нормально, VK не поддерживает PKCE