Zum Hauptinhalt springen

Authentifizierung zu deiner Hasura-Anwendung hinzufügen

Hasura ist ein Tool, das schnell entsprechende GraphQL- und REST-APIs für deine Daten bereitstellen kann. In Anbetracht der Datensicherheit bietet Hasura auch die Möglichkeit, den Zugriff für jede API fein abzustimmen.

Normalerweise nutzen Hasura-Benutzer andere Identitätsmanagement- und Authentifizierungsdienste, wobei Logto einer der beliebtesten ist.

In diesem Blogbeitrag gehen wir davon aus, dass du bereits Hasura-Dienste nutzt. Wir werden erklären, wie man Hasura und Logto integriert, um die Sicherheit deiner Daten zu maximieren. Wenn du noch kein Logto-Konto hast, melde dich an und beginne jetzt damit!

Hintergrund

Hasura verwendet rollenbasierte Zugriffsverwaltung, während Logto die standardmäßige Rollenbasierte Zugangskontrolle (RBAC) nutzt.

Im Logto-Modell und den Best Practices für RBAC empfehlen wir Benutzern, Berechtigung zu verwenden, um die feinste Granularität von Berechtigungen darzustellen, Rolle als eine Gruppe von Berechtigungen für bequeme Batch-Operationen zu verwenden und letztendlich Berechtigung (normalerweise auf der Seite der Ressourcenanbieter) zu überprüfen, um zu verifizieren, ob ein Benutzer eine bestimmte Operation ausführen kann.

In Hasura entspricht eine Rolle der feinsten Granularität von Berechtigungen, und Berechtigungsprüfungen werden gegen Rollen durchgeführt. Daher empfehlen wir bei der Konfiguration von Logto, eine Rolle genau einer Berechtigung zuzuordnen. Dieser Ansatz kann die Berechtigungen von Logto und Hasura miteinander verknüpfen, um Verwirrung und Missbrauch zu vermeiden.

Hasura kann die Zugangskontrolle mit Webhooks oder JWT unterstützen. Unser vorheriger Blogbeitrag führte ein, wie man Webhooks verwendet, und in den folgenden Abschnitten erklären wir, wie man den JWT-Modus der Zugangskontrolle von Hasura nutzt.

Erste Schritte

Beginnen wir mit einem einfachen Beispiel. Angenommen, ein Benutzer hat bereits zwei APIs in Hasura, GET /user und PATCH /user, die jeweils zwei Rollen entsprechen: user:reader und user:maintainer.

1. Hasura-API-Ressource in Logto erstellen

Erstelle eine Hasura-API-Ressource in Logto.

Hasura API

2. Rollen gemäß Hasura-Setup in Logto erstellen

Wir müssen zwei Berechtigungen für die in Schritt 1 erwähnte Hasura-API-Ressource erstellen, nämlich read:user und maintain:user, und dann zwei Rollen erstellen: user:reader (enthält die read:user Berechtigung) und user:maintainer (einschließlich der maintain:user Berechtigung), um eins zu eins mit den Rollen von Hasura zu korrespondieren. Und diese Rollen nach Bedarf Logto-Benutzern zuweisen.

Hasura API mit Berechtigungen Benutzerleserrolle Benutzerbetreuerrolle

3. Hasura-Umgebungsvariable HASURA_GRAPHQL_JWT_SECRET konfigurieren, um den JWT-Modus zu aktivieren

Durch das Studium der Hasura JWT-Konfigurationsoptionen müssen wir die Umgebungsvariable HASURA_GRAPHQL_JWT_SECRET hinzufügen und konfigurieren, bevor wir JWT für die Zugangskontrolle verwenden können.

Es gibt viele verschiedene Optionen, die konfiguriert werden können, aber hier stellen wir den einfachsten Fall vor: nur die jwk_url muss konfiguriert werden. Dieser Wert kann von deinem Logto OpenID-Konfigurationsendpunkt (https://your.logto.domain/oidc/.well-known/openid-configuration) abgerufen werden.

Hasura JWT-Konfiguration

4. Benutzerzugangstoken mit zusätzlichen Ansprüchen anpassen

Verwende die benutzerdefinierte Token-Ansprüche-Funktion von Logto, um die Logik anzupassen, um zusätzliche Ansprüche zum Benutzerzugangstoken hinzuzufügen.

Benutzerzugangstoken-Skript

Passe die Methode getCustomJwtClaims an, um Daten im JWT hinzuzufügen, auf die sich Hasura zur Implementierung der Zugangskontrolle stützt. Dies kann Daten im Zusammenhang mit dem Benutzer umfassen, der in diesem Fall autorisiert wird, einschließlich der Rollen, die sie besitzen, auf die über context zugegriffen werden kann.

Wir haben auch eine Umgebungsvariable USER_DEFAULT_ROLE_NAMES definiert, um Hardcoding zu vermeiden.

5. Logto SDK integrieren

Nach der Konfiguration von Logto und Hasura integriere deine App mit dem Logto SDK. Hier verwenden wir ein React-Beispiel, um das Benutzerzugangstoken anzuzeigen, das von Logto nach der Benutzeranmeldung ausgegeben wird.

Benutzer mit Rollen

Zuerst weisen wir dem Benutzer die zuvor erstellten Rollen user:reader und user:maintainer zu und melden uns dann als dieser Benutzer an.

const config: LogtoConfig = {
endpoint: 'http://localhost:3001',
appId: '<your-application-id>',
appSecret: '<your-application-secret>',
scopes: [
...// bestehende Berechtigungen
'read:user',
'maintain:user',
],
resources: [
...// bestehende Ressourcen
'https://*.hasura.app/api',
],
};

Erhalte das Benutzerzugangstoken und fordere Hasura-APIs an:

const accessToken = await logto.getAccessToken('https://*.hasura.app/api');

// Bevor die Anfrage an Hasura gesendet wird
request.headers.set('Authorization', `Bearer ${accessToken}`);
request.headers.set('x-Hasura-Role', '<erforderliche-Rolle-für-den-Endpunkt>');

Fazit

In diesem Artikel bieten wir eine weitere Methode der JWT-basierten Zugangskontrolle, die von Hasura unterstützt wird, zusätzlich zu Webhook.

Durch den Vergleich der Prozesse von Hasuras Webhook und JWT Zugangskontrolle können wir sehen, dass der Webhook-Ansatz bei jeder Hasura-Anfrage einen Webhook an Logto sendet und auf eine Antwort wartet; während der JWT-basierte Ansatz kontinuierlich verwendet werden kann, bis das JWT abläuft.

Der JWT-Ansatz kann die Netzwerklast reduzieren und die durch Webhooks verursachte Netzwerklatenz eliminieren; während der Webhook-Ansatz Änderungen in den Benutzerberechtigungen in Echtzeit synchronisieren kann.

Benutzer können den geeigneten Ansatz basierend auf diesen Schlussfolgerungen und ihren tatsächlichen geschäftlichen Anforderungen wählen.