From d1e35dd8b1069bb4824924d17317edbb84ba3928 Mon Sep 17 00:00:00 2001 From: Untone Date: Sun, 28 Sep 2025 20:04:52 +0300 Subject: [PATCH] oauth-redirect-uri-fix --- auth/oauth.py | 28 ++++++++++++++++++++++++---- 1 file changed, 24 insertions(+), 4 deletions(-) diff --git a/auth/oauth.py b/auth/oauth.py index b4991514..e72e01cf 100644 --- a/auth/oauth.py +++ b/auth/oauth.py @@ -674,12 +674,25 @@ async def oauth_callback_http(request: Request) -> JSONResponse | RedirectRespon logger.info(f"🔧 Authorization response URL: {request.url}") logger.info(f"🔧 Code parameter: {code[:20]}..." if code and len(code) > 20 else f"🔧 Code parameter: {code}") + # Получаем БАЗОВЫЙ backend URL (только схема + хост, без пути!) + scheme = "https" if request.url.netloc != "localhost:8000" else request.url.scheme + backend_base_url = f"{scheme}://{request.url.netloc}" + + # Получаем callback URI (тот же, что использовался при авторизации) + callback_uri = f"{backend_base_url}/oauth/{provider}/callback" try: if provider in ["vk", "yandex", "telegram", "facebook"]: # Провайдеры без PKCE поддержки (Facebook может иметь проблемы с PKCE) logger.info(f"🔧 Using OAuth without PKCE for {provider}") - token = await client.fetch_access_token( - authorization_response=str(request.url), + logger.info(f"🔧 Callback URI: {callback_uri}") + + # Используем более низкоуровневый подход для передачи redirect_uri + token = await client.fetch_token( + client.token_endpoint, + grant_type="authorization_code", + code=code, + redirect_uri=callback_uri, + client_id=client.client_id, ) else: # Провайдеры с PKCE поддержкой @@ -690,9 +703,16 @@ async def oauth_callback_http(request: Request) -> JSONResponse | RedirectRespon logger.info(f"🔧 Using OAuth with PKCE for {provider}") logger.info(f"🔧 Code verifier length: {len(code_verifier) if code_verifier else 0}") - token = await client.fetch_access_token( - authorization_response=str(request.url), + logger.info(f"🔧 Callback URI: {callback_uri}") + + # Используем более низкоуровневый подход для передачи redirect_uri + token = await client.fetch_token( + client.token_endpoint, + grant_type="authorization_code", + code=code, + redirect_uri=callback_uri, code_verifier=code_verifier, + client_id=client.client_id, ) except Exception as e: logger.error(f"❌ Failed to fetch access token for {provider}: {e}", exc_info=True)