Log TeamSnap token exchange failures

This commit is contained in:
Codex
2026-04-24 09:52:29 -05:00
parent 2574dc52c5
commit 022609191f

View File

@@ -1,5 +1,6 @@
from __future__ import annotations from __future__ import annotations
import logging
import secrets import secrets
from datetime import datetime, timedelta, timezone from datetime import datetime, timedelta, timezone
from urllib.parse import urlencode from urllib.parse import urlencode
@@ -13,6 +14,8 @@ from .config import settings
from .database import get_db from .database import get_db
from .models import UserSession from .models import UserSession
logger = logging.getLogger(__name__)
def utcnow() -> datetime: def utcnow() -> datetime:
return datetime.now(timezone.utc) return datetime.now(timezone.utc)
@@ -119,36 +122,57 @@ async def fetch_teamsnap_user_id(access_token: str) -> str | None:
async def exchange_code_for_token(code: str) -> dict: async def exchange_code_for_token(code: str) -> dict:
async with httpx.AsyncClient(timeout=15.0) as client: try:
response = await client.post( async with httpx.AsyncClient(timeout=15.0) as client:
settings.teamsnap_token_url, response = await client.post(
data={ settings.teamsnap_token_url,
"grant_type": "authorization_code", data={
"code": code, "grant_type": "authorization_code",
"redirect_uri": settings.teamsnap_redirect_uri, "code": code,
"client_id": settings.teamsnap_client_id, "redirect_uri": settings.teamsnap_redirect_uri,
"client_secret": settings.teamsnap_client_secret, "client_id": settings.teamsnap_client_id,
}, "client_secret": settings.teamsnap_client_secret,
headers={"Accept": "application/json"}, },
) headers={"Accept": "application/json"},
)
except httpx.HTTPError as exc:
logger.exception("TeamSnap token exchange request failed")
raise HTTPException(status_code=status.HTTP_502_BAD_GATEWAY, detail="TeamSnap token exchange failed") from exc
if response.status_code >= 400: if response.status_code >= 400:
logger.error(
"TeamSnap token exchange rejected: status=%s body=%s redirect_uri=%s client_id_suffix=%s",
response.status_code,
response.text,
settings.teamsnap_redirect_uri,
settings.teamsnap_client_id[-6:] if settings.teamsnap_client_id else "",
)
raise HTTPException(status_code=status.HTTP_502_BAD_GATEWAY, detail="TeamSnap token exchange failed") raise HTTPException(status_code=status.HTTP_502_BAD_GATEWAY, detail="TeamSnap token exchange failed")
return response.json() return response.json()
async def refresh_access_token(refresh_token: str) -> dict: async def refresh_access_token(refresh_token: str) -> dict:
async with httpx.AsyncClient(timeout=15.0) as client: try:
response = await client.post( async with httpx.AsyncClient(timeout=15.0) as client:
settings.teamsnap_token_url, response = await client.post(
data={ settings.teamsnap_token_url,
"grant_type": "refresh_token", data={
"refresh_token": refresh_token, "grant_type": "refresh_token",
"client_id": settings.teamsnap_client_id, "refresh_token": refresh_token,
"client_secret": settings.teamsnap_client_secret, "client_id": settings.teamsnap_client_id,
}, "client_secret": settings.teamsnap_client_secret,
headers={"Accept": "application/json"}, },
) headers={"Accept": "application/json"},
)
except httpx.HTTPError as exc:
logger.exception("TeamSnap token refresh request failed")
raise HTTPException(status_code=status.HTTP_502_BAD_GATEWAY, detail="TeamSnap token refresh failed") from exc
if response.status_code >= 400: if response.status_code >= 400:
logger.error(
"TeamSnap token refresh rejected: status=%s body=%s client_id_suffix=%s",
response.status_code,
response.text,
settings.teamsnap_client_id[-6:] if settings.teamsnap_client_id else "",
)
raise HTTPException(status_code=status.HTTP_502_BAD_GATEWAY, detail="TeamSnap token refresh failed") raise HTTPException(status_code=status.HTTP_502_BAD_GATEWAY, detail="TeamSnap token refresh failed")
return response.json() return response.json()