Logto x Hasura: Nutzung von JWT für Zugriffskontrolle
Dieser umfassende Leitfaden skizziert die Schritte zur Integration von Logto mit Hasuras JWT-Modus-Zugriffskontrolle und erhöht somit die Datensicherheit.
Hasura ist ein Werkzeug, das schnell entsprechende GraphQL- und REST-APIs für deine Daten bereitstellen kann. Aufgrund der Datensicherheit bietet Hasura auch die Möglichkeit, die Zugriffskontrolle für jede API feinzutunen.
In der Regel nutzen Hasura-Benutzer andere Identitätsmanagement- und Authentifizierungsdienste, wobei Logto einer der beliebtesten darunter ist.
In diesem Blogbeitrag gehen wir davon aus, dass du bereits Hasura-Dienste verwendest. Wir stellen vor, wie Hasura und Logto integriert werden können, 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 Zugriffskontrolle, während Logto den Standard Role-based Access Control (RBAC) nutzt.
In Logtos Modell und Best Practices für RBAC empfehlen wir Benutzern, scope
für die feinste Granularität der Berechtigungen zu verwenden, role
als eine Reihe von scope
s für praktische Batch-Operationen zu nutzen und letztendlich scope
(normalerweise auf der Seite der Ressourcenanbieter) zu überprüfen, um zu verifizieren, ob ein Benutzer eine bestimmte Operation durchführen kann.
In Hasura entspricht eine role
der feinsten Granularität der Berechtigungen, und Berechtigungsprüfungen werden gegen role
s durchgeführt. Daher empfehlen wir bei der Konfiguration von Logto, eine role
genau einer scope
zuzuordnen. Dieser Ansatz kann die Berechtigungen von Logto und Hasura verknüpfen, um Verwirrung und Missbrauch zu vermeiden.
Hasura kann Zugriffskontrolle mit Webhooks oder JWT unterstützen. In unserem vorherigen Blogbeitrag haben wir erklärt, wie man Webhooks verwendet, und in den folgenden Abschnitten erklären wir, wie man die Zugriffskontrolle im JWT-Modus 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 den Rollen user:reader
und user:maintainer
entsprechen.
1. Erstelle eine Hasura API-Ressource in Logto
Erstelle eine Hasura API-Ressource in Logto.
2. Erstelle Rollen entsprechend der Hasura-Konfiguration in Logto
Wir müssen zwei scope
s 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
scope) und user:maintainer
(einschließlich der maintain:user
scope), um eins zu eins mit Hasuras Rollen zu korrespondieren. Weise diese Rollen den Logto-Benutzern nach Bedarf zu.
3. Konfiguriere die Hasura-Umgebungsvariable HASURA_GRAPHQL_JWT_SECRET
, um den JWT-Modus zu aktivieren
Durch Überprüfung der Hasura JWT-Konfigurationsoptionen müssen wir die Umgebungsvariable HASURA_GRAPHQL_JWT_SECRET
hinzufügen und konfigurieren, bevor wir JWT für die Zugriffskontrolle 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.
4. Benutzerzugriffstoken anpassen für extra Claims
Verwende die benutzerdefinierte JWT-Funktion von Logto, um die Logik anzupassen und zusätzliche Claims zum JWT-formatigen Benutzerzugriffstoken hinzuzufügen.
Passe die Methode getCustomJwtClaims
an, um Daten im JWT hinzuzufügen, auf die Hasura für die Implementierung der Zugriffskontrolle angewiesen ist. Dazu können Daten gehören, die mit dem zum Zeitpunkt autorisierten Benutzer zusammenhängen, einschließlich der role
s, die sie besitzen und die über context
abgerufen werden können.
Wir haben auch eine Umgebungsvariable USER_DEFAULT_ROLE_NAMES
definiert, um Hardcodierung zu vermeiden.
5. Logto SDK integrieren
Nach der Konfiguration von Logto und Hasura integriere deine App mit dem Logto SDK. Hier verwenden wir ein Next Beispiel, um das nach Benutzeranmeldung von Logto ausgestellte Benutzerzugriffstoken in der Vorschau anzuzeigen.
Zuerst weisen wir die zuvor erstellten user:reader
und user:maintainer
Rollen dem Benutzer zu und melden uns dann als dieser Benutzer an.
Holen dir das Benutzerzugriffstoken und fordere die Hasura-APIs an:
Fazit
In diesem Artikel bieten wir eine weitere Methode der JWT-basierten Zugriffskontrolle an, die von Hasura neben Webhook unterstützt wird.
Durch Vergleich der Prozesse der JWT-basierten Webhook- und JWT-Zugriffskontrolle von Hasura können wir sehen, dass der Webhook-Ansatz bei jeder Hasura-Anfrage ein 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 Netzwerkverzögerung eliminieren; während der Webhook-Ansatz Änderungen in Benutzerberechtigungen in Echtzeit synchronisieren kann.
Benutzer können anhand dieser Schlussfolgerungen in Kombination mit ihren tatsächlichen Geschäftsanforderungen den passenden Ansatz wählen.