Roll out fetch_identity() to the remaining built-in providers, following the pattern established in #45 / #46 (Google + GitHub).
Shape rules
IdentityProfile is best-effort: every field except possibly subject may be None. Always populate raw with the upstream payload.
- Two identity flavors, both shipped through the same
IdentityProfile:
- User identity — person claims (sub, email, name, picture). Microsoft, Atlassian, Typeform, Salesforce, Linear, Notion-external, Slack-SiwS.
- Account/integration identity — workspace/portal/bot context with optional or absent person email. Notion-internal, HubSpot.
- No assumption that access tokens are JWTs — Microsoft Graph tokens may be opaque.
Sub-issues
Out of scope
- Slack workspace-bot identity (
users.identity / auth.test) — reconsider only if a use case lands.
- A standalone "provider identity matrix" doc — defer until in-repo drift makes it necessary.
Roll out
fetch_identity()to the remaining built-in providers, following the pattern established in #45 / #46 (Google + GitHub).Shape rules
IdentityProfileis best-effort: every field except possiblysubjectmay beNone. Always populaterawwith the upstream payload.IdentityProfile:Sub-issues
Out of scope
users.identity/auth.test) — reconsider only if a use case lands.