fix: enhance logging in token introspection and validation for better debugging

This commit is contained in:
Mabe
2026-06-21 17:23:52 +02:00
parent 93f20e191c
commit c2f8c36bbb
3 changed files with 9 additions and 6 deletions
+7 -5
View File
@@ -86,6 +86,7 @@ def get_introspection_endpoint() -> Optional[str]:
def introspect_token(token: str) -> Dict[str, Any]:
introspection_endpoint = get_introspection_endpoint()
if not introspection_endpoint:
logger.error("Introspection endpoint not available")
raise HTTPException(status_code=401, detail="Unable to introspect token")
data = {"token": token, "token_type_hint": "access_token"}
@@ -98,6 +99,9 @@ def introspect_token(token: str) -> Dict[str, Any]:
with httpx.Client(timeout=10.0) as client:
response = client.post(introspection_endpoint, data=data, headers={"Accept": "application/json"}, auth=auth)
logger.debug("Introspection request to %s returned %s", introspection_endpoint, response.status_code)
logger.debug("Introspection response text: %s", response.text)
if response.status_code != 200:
raise HTTPException(status_code=401, detail="Unable to introspect token")
@@ -120,6 +124,7 @@ async def validate_token(credentials: HTTPAuthorizationCredentials = Security(se
key = get_signing_key(token)
public_key = jwk.construct(key)
discovery = get_discovery()
logger.debug("Validating token with JWKS; issuer=%s, audience=%s", discovery.get("issuer"), settings.oidc_audience)
# Only pass `audience` to the decoder if configured. Some providers
# (or local development setups) may not include the aud claim in a
# way that matches your API identifier; in that case leave
@@ -132,14 +137,11 @@ async def validate_token(credentials: HTTPAuthorizationCredentials = Security(se
jwt_kwargs["audience"] = settings.oidc_audience
verified = jwt.decode(token, public_key, **jwt_kwargs)
logger.debug("JWT validation succeeded; claims=%s", verified)
except JWTError:
logger.exception("JWT validation failed, attempting introspection")
verified = introspect_token(token)
try:
return TokenClaims(**verified)
except Exception as exc:
raise HTTPException(status_code=401, detail="Unable to parse token claims") from exc
logger.debug("Introspection succeeded; claims=%s", verified)
try:
return TokenClaims(**verified)
+1
View File
@@ -119,4 +119,5 @@ async def auth_callback(payload: AuthCallbackRequest):
@app.post("/chat", response_class=StreamingResponse)
async def chat(request: ChatRequest, token=Depends(validate_token)):
logger.debug("Chat request authenticated: %s", token.dict())
return StreamingResponse(event_stream(request), media_type="text/event-stream")
+1 -1
View File
@@ -165,7 +165,7 @@ async function handleRedirectCallback(): Promise<string | null> {
})
const result = await response.json()
const token = result.id_token || result.access_token
const token = result.access_token || result.id_token
if (response.ok && token) {
setLocalToken(token)
return token