OAuth2 OpenID Connect provider support etc. #3

Merged
LeoVasanko merged 65 commits from oidconnect into main 2026-02-18 02:40:27 +00:00
Showing only changes of commit 5bc92ce983 - Show all commits
+34 -3
View File
@@ -401,37 +401,68 @@ async def userinfo(
Returns claims about the authenticated user.
Requires Bearer token from /token endpoint.
"""
print(f"DEBUG UserInfo: Received request from {request.client.host}")
print(f"DEBUG UserInfo: Authorization header present: {bool(credentials)}")
if not credentials:
print("DEBUG UserInfo: No credentials provided")
raise HTTPException(401, "Bearer token required")
print(f"DEBUG UserInfo: Token length: {len(credentials.credentials)}")
print(f"DEBUG UserInfo: Token prefix: {credentials.credentials[:50]}...")
issuer = _get_issuer(request)
print(f"DEBUG UserInfo: Computed issuer: {issuer}")
payload = oidjwt.decode_access_token(credentials.credentials, issuer)
print(f"DEBUG UserInfo: JWT decode result: {payload is not None}")
if not payload:
print("DEBUG UserInfo: JWT decode failed")
raise HTTPException(401, "Invalid or expired token")
print(f"DEBUG UserInfo: Decoded payload: {payload}")
# Verify audience is a valid client
aud = payload.get("aud")
print(f"DEBUG UserInfo: Audience claim: {aud}")
if not aud:
print("DEBUG UserInfo: Missing aud claim")
raise HTTPException(401, "Invalid token (missing aud claim)")
try:
client_uuid = UUID(aud)
print(f"DEBUG UserInfo: Client UUID: {client_uuid}")
except ValueError:
print(f"DEBUG UserInfo: Invalid UUID format: {aud}")
raise HTTPException(401, "Invalid token (invalid aud format)")
if not db.data().oid_clients.get(client_uuid):
client = db.data().oid_clients.get(client_uuid)
print(f"DEBUG UserInfo: Client found: {client is not None}")
if not client:
print(f"DEBUG UserInfo: Unknown client UUID: {client_uuid}")
raise HTTPException(401, "Invalid token (unknown client)")
# Get user
sub = payload.get("sub")
print(f"DEBUG UserInfo: Subject claim: {sub}")
try:
user_uuid = UUID(payload["sub"])
except (KeyError, ValueError):
user_uuid = UUID(sub)
print(f"DEBUG UserInfo: User UUID: {user_uuid}")
except (KeyError, ValueError) as e:
print(f"DEBUG UserInfo: Invalid sub claim: {e}")
raise HTTPException(401, "Invalid token")
user = db.data().users.get(user_uuid)
print(f"DEBUG UserInfo: User found: {user is not None}")
if not user:
print(f"DEBUG UserInfo: Unknown user UUID: {user_uuid}")
raise HTTPException(401, "User not found")
print("DEBUG UserInfo: All validations passed, proceeding with response")
# Get user's permissions scoped to this OIDC client (domain == client UUID)
role = user.role
org = role.org