oauth-github
Some checks failed
Deploy on push / deploy (push) Has been cancelled

This commit is contained in:
2025-09-28 20:52:17 +03:00
parent 44b69dc743
commit c338bdc683

View File

@@ -233,30 +233,45 @@ PROVIDER_HANDLERS = {
async def _fetch_github_profile(client: Any, token: Any) -> dict:
"""Получает профиль из GitHub API"""
try:
# Получаем основной профиль
profile = await client.get("user", token=token)
profile_data = profile.json()
# Извлекаем access_token из ответа
access_token = token.get("access_token") if isinstance(token, dict) else token
# Проверяем наличие ошибок в ответе GitHub
if "message" in profile_data:
logger.error(f"GitHub API error: {profile_data['message']}")
if not access_token:
logger.error("No access_token found in GitHub token response")
return {}
# Получаем email адреса (требует scope user:email)
emails = await client.get("user/emails", token=token)
emails_data = emails.json()
# Ищем основной email
primary_email = None
if isinstance(emails_data, list):
primary_email = next((email["email"] for email in emails_data if email.get("primary")), None)
return {
"id": str(profile_data.get("id", "")),
"email": primary_email or profile_data.get("email"),
"name": profile_data.get("name") or profile_data.get("login", ""),
"picture": profile_data.get("avatar_url"),
# Используем прямой HTTP запрос к GitHub API
headers = {
"Authorization": f"Bearer {access_token}",
"Accept": "application/vnd.github.v3+json",
"User-Agent": "Discours-OAuth-Client",
}
async with httpx.AsyncClient() as http_client:
# Получаем основной профиль
profile_response = await http_client.get("https://api.github.com/user", headers=headers)
if profile_response.status_code != 200:
logger.error(f"GitHub API error: {profile_response.status_code} - {profile_response.text}")
return {}
profile_data = profile_response.json()
# Получаем email адреса (требует scope user:email)
emails_response = await http_client.get("https://api.github.com/user/emails", headers=headers)
emails_data = emails_response.json() if emails_response.status_code == 200 else []
# Ищем основной email
primary_email = None
if isinstance(emails_data, list):
primary_email = next((email["email"] for email in emails_data if email.get("primary")), None)
return {
"id": str(profile_data.get("id", "")),
"email": primary_email or profile_data.get("email"),
"name": profile_data.get("name") or profile_data.get("login", ""),
"picture": profile_data.get("avatar_url"),
}
except Exception as e:
logger.error(f"Error fetching GitHub profile: {e}")
return {}
@@ -694,7 +709,7 @@ async def oauth_callback_http(request: Request) -> JSONResponse | RedirectRespon
"telegram": "https://oauth.telegram.org/auth/token",
"facebook": "https://graph.facebook.com/v18.0/oauth/access_token",
}
token_endpoint = token_endpoints.get(provider)
if not token_endpoint:
logger.error(f"❌ Unknown token endpoint for provider: {provider}")
@@ -739,7 +754,7 @@ async def oauth_callback_http(request: Request) -> JSONResponse | RedirectRespon
"google": "https://oauth2.googleapis.com/token",
"github": "https://github.com/login/oauth/access_token",
}
token_endpoint = token_endpoints.get(provider)
if not token_endpoint:
logger.error(f"❌ Unknown token endpoint for provider: {provider}")