Skip to content

Commit 3e7eaa3

Browse files
mjunaidcaclaude
andcommitted
fix(auth): extract tenant_id from organization_ids JWT claim
The JWT contains organization_ids (array) not organization_id (singular). This was causing the workers endpoint to use fallback "taskflow-default-org-id" which SSO rejected with 401. Now extracts first organization from organization_ids array as tenant. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
1 parent 0cdda26 commit 3e7eaa3

1 file changed

Lines changed: 8 additions & 2 deletions

File tree

apps/api/src/taskflow_api/auth.py

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -220,9 +220,14 @@ def __init__(self, payload: dict[str, Any]) -> None:
220220
self.name: str = payload.get("name", "")
221221
self.role: str = payload.get("role", "user")
222222
# Extract tenant from multiple possible JWT claims
223+
# organization_ids is an array, take the first one as active tenant
224+
org_ids = payload.get("organization_ids") or []
223225
self.tenant_id: str | None = (
224-
payload.get("tenant_id") or payload.get("organization_id") or None
226+
payload.get("tenant_id")
227+
or payload.get("organization_id")
228+
or (org_ids[0] if org_ids else None)
225229
)
230+
self.organization_ids: list[str] = org_ids if isinstance(org_ids, list) else []
226231
# OAuth client identity for audit trail (e.g., "@user via Claude Code")
227232
self.client_id: str | None = payload.get("client_id")
228233
self.client_name: str | None = payload.get("client_name")
@@ -272,7 +277,8 @@ async def list_projects(user: CurrentUser = Depends(get_current_user)):
272277
try:
273278
payload = await verify_jwt(token)
274279
user = CurrentUser(payload)
275-
logger.info("[AUTH] Authenticated via JWT: %s", user)
280+
logger.info("[AUTH] Authenticated via JWT: %s, tenant_id=%s, org_ids=%s",
281+
user, user.tenant_id, user.organization_ids)
276282
return user
277283
except HTTPException:
278284
# JWT validation failed, try opaque as fallback

0 commit comments

Comments
 (0)