Tokens und Claims
Was das Zugriffstoken trägt, wie Sie es prüfen und wofür es nicht da ist.
Das Zugriffstoken
Ein JWT für Ihr Backend. Ein dekodiertes Beispiel mit erfundenen Werten:
{
"iss": "https://example-project.supabase.co/auth/v1",
"sub": "3f0c9a52-7d1e-4b8a-9c6f-2e5d8b1a4c70",
"aud": "authenticated",
"iat": 1792682619,
"exp": 1792686219,
"client_id": "9d4b7c1e-3a2f-4e5d-8b6a-7c0f1e2d3a4b",
"scope": "openid",
"tenant_id": "c2a8e6f4-1b3d-4f5a-9e7c-0d2b4f6a8c1e",
"frontend_role": "member",
"email": "anna.berger@pannoniqa.example",
"given_name": "Anna",
"family_name": "Berger",
"role": "frontend_user",
"user_metadata": {},
"phone": ""
}
Lesen Sie diese Claims:
| Claim | Bedeutung |
|---|---|
sub | Der Frontend-Benutzer, stabil für die Lebensdauer des Kontos. Führen Sie Ihre Benutzer unter diesem Wert. Dieselbe Person hat bei zwei Organisationen zwei unabhängige sub. |
tenant_id | Die Organisation, zu der der Benutzer gehört. |
client_id | Das Frontend, für das das Token ausgestellt wurde. |
scope | Immer openid. |
frontend_role | authenticated oder member (siehe Frontend-Rolle). Nur auf diesen OAuth-Tokens. |
email | Die echte, bestätigte Adresse des Benutzers, in Kleinbuchstaben. Sie kann sich ändern; führen Sie einen Benutzer nie unter ihr. |
given_name, family_name | Die Namen, die der Benutzer bei der Registrierung angegeben hat. |
iss, aud, exp, iat | Standard-Claims eines JWT. aud ist für das Token jedes Frontends authenticated. |
Lesen Sie die anderen nie:
roleist die Datenbank-Rolle (frontend_user), nicht die Frontend-Rolle.user_metadataist immer{}undphoneimmer"".app_metadata,session_id,aal,amrundis_anonymousgehören dem Auth-Server. Nehmen Sie die Organisation aus demtenant_idder obersten Ebene.
Prüfen Sie jedes Zugriffstoken, bevor Sie ihm vertrauen
- Prüfen Sie die Signatur gegen die Schlüssel von
<auth>/.well-known/jwks.json. Speichern Sie sie zwischen und laden Sie sie bei einer unbekanntenkidneu. Akzeptieren Sie nur den Algorithmus des Schlüssels in JWKS; nieHS256odernone. - Prüfen Sie
issgegen den Issuer aus der Discovery,expundaudauthenticated. - Prüfen Sie, dass
client_idIhre eigene Client-ID ist.audist für jedes Frontend gleich, nurclient_idbindet ein Token und seinefrontend_rolean Ihr Frontend. Ohne diese Prüfung akzeptiert Ihr Backend ein Token, das ein anderes Frontend der Organisation erhalten hat, mit dessenmember, und das kann eine andere Community bedeuten. - Prüfen Sie, dass
tenant_idIhre Organisation ist. - Erst dann lesen Sie
frontend_role,sub,emailund die Namen.
Wofür das Zugriffstoken nicht da ist
- Senden Sie es nie als Bearer-Token an das Studio. Das Studio weist jedes
Authorization: Bearermit einem Zugriffstoken ab, und die Mitglieder-API authentifiziert Ihr Backend über seinen Frontend-Schlüssel. Die einzige Ausnahme istGET /api/v1/members/me, das das Token zusätzlich zum Schlüssel in einem eigenen Header nimmt (siehe Das angemeldete Mitglied). - Senden Sie es nie an die Datenbank-, Storage- oder GraphQL-APIs des Projekts. Es trägt die Datenbankrolle
frontend_user, die dort auf nichts zugreifen darf. - Rufen Sie damit nie
GET <auth>/user(oder einen anderen<auth>/user-Endpunkt) auf: Er antwortet mit der internen technischen Adresse des Kontos, nicht mit der echten E-Mail-Adresse. Außer an/oauth/userinfosenden Sie es überhaupt nie an<auth>. - Behalten Sie es auf Ihrem Server. Geben Sie Zugriffs- oder Refresh-Token nie an den Browser weiter.
ID-Token und UserInfo
Beide tragen über den Benutzer nur sub, weil der Scope allein openid ist. Das ID-Token trägt außerdem die Standard-Claims iss, aud, exp und iat und Ihre nonce, falls Sie eine gesendet haben. Alles andere steht im Zugriffstoken.