oauth-redirect-uri-fix
All checks were successful
Deploy on push / deploy (push) Successful in 2m54s

This commit is contained in:
2025-09-28 20:04:52 +03:00
parent dcdb6c7b30
commit d1e35dd8b1

View File

@@ -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)