Was JSON:API NICHT tut
JSON:API ist vollständig entitätsbasiert. Das bedeutet, es kann keine Geschäftslogik verarbeiten oder Dinge tun, die nicht als "CRUD" (Create, Read, Update, Delete) verstanden werden können. Geschäftslogik wie das Registrieren eines neuen Kontos, das Einloggen eines Benutzers oder das Anfordern eines neuen Passworts sind nicht Teil von JSON:API. Viele dieser Funktionen werden bereits vom Drupal Core bereitgestellt.
Eine nicht abschließende Liste häufiger Anforderungen und Lösungen findest du unten.
Interessante Pfade sind:
- /session/token
- /user/register
- /user/login
- /user/login_status
- /user/logout
Abrufen eines Session-Tokens
Token abrufen
curl \
--request GET http://drupal.d8/session/token
Das Token wird als einfacher Text (kein JSON) im Antwort-Body zurückgegeben.
Tokens verwenden
Neben einem Session-Token erhältst du beim Login ein csrf_token und ein logout_token. Du benötigst das logout_token, um einen Benutzer abzumelden (siehe unten). Das csrf_token oder das Session-Token ist für verändernde Requests (z. B. POST, PATCH und DELETE) erforderlich.
Benutzerregistrierung
Während JSON:API (wie im Core bereitgestellt) keine neuen Benutzerregistrierungen unterstützt, kannst du das JSON:API User Resources Modul installieren, um benutzerbezogene JSON:API-Endpunkte hinzuzufügen, darunter Endpunkte für Registrierung, Passwort zurücksetzen und Passwort-Änderung.
Alternativ kannst du das Core REST-Modul verwenden. Um Benutzern die Registrierung per REST zu erlauben, muss die user_registration REST-Resource aktiviert werden (siehe das REST UI Beispiel unten).
curl \
--header "Content-Type: application/json" \
--header "X-CSRF-Token: 57sTS-KS7UoYAWAPyzt0iJmo300CFct3jdKyWM-UiiQ" \
--request POST "https://drupal.d9/user/register?_format=json" \
--data '{"name": {"value": "thename123"}, "pass": {"value": "thepass"}, "mail": {"value": "someone@example.com"}}'
Verwende den Wert des Session-Tokens im X-CSRF-Token Header. Eine erfolgreiche Antwort sollte einige Benutzerfeldwerte, einschließlich der UUID des neu erstellten Benutzers, enthalten:
{
"uuid" : [ { "value" : "3e75b757-831e-4bf7-bbb6-25b8c50c7ac0" } ]
}
Beachte auch, dass die Antwort keine "Set-Cookie" Header enthält, selbst wenn Besucher berechtigt sind, selbst ein Konto zu erstellen. Falls keine Genehmigung oder Bestätigung erforderlich ist, kannst du den Benutzer nach erfolgreicher Registrierung mit denselben name- und pass-Werten einloggen.
Benutzer-Login
curl \
--header "Content-type: application/json" \
-c cookie.txt \
--request POST "http://drupal.d8/user/login?_format=json" \
--data '{"name":"admin", "pass":"admin"}'
Das -c cookie.txt
weist curl an, ein Cookie zu speichern. Die Antwort sollte ungefähr so aussehen:
{
"csrf_token" : "57sTS-KS7UoYAWAPyzt0iJmo300CFct3jdKyWM-UiiQ",
"logout_token" : "zzRaD8ZgLT1TkG804mYpVVTyM-pgoDm4h9XZ9JHSoCw",
"current_user" : {
"roles" : [
"authenticated",
"administrator"
],
"name" : "admin",
"uid" : "1"
}
}
Benutzerstatus
curl \
--header "Content-type: application/json" \
-b cookie.txt \
--request GET "http://drupal.d8/user/login_status?_format=json"
-b cookie.txt
weist curl an, das Cookie der letzten Anfrage zu senden (nicht zu speichern). Wenn du eingeloggt bist, wird 1
im Antwort-Body (Plain Text, kein JSON) zurückgegeben, sonst 0
.
Benutzer-Logout
curl \
--header "Content-type: application/json" \
-b cookie.txt \
--request POST "http://drupal.d8/user/logout?_format=json&token=zzRaD8ZgLT1TkG804mYpVVTyM-pgoDm4h9XZ9JHSoCw"
Damit wird der durch cookie.txt
authentifizierte Benutzer ausgeloggt. Verwende das logout_token im token-Query-Parameter.
Authentifizierungs-Mechanismen
Das obige Beispiel ist nur einer von vielen verfügbaren Authentifizierungsmechanismen. Du solltest prüfen, welcher Mechanismus für deine Anforderungen am besten geeignet ist.
Ein Drupal OAuth-Modul ist als simple_oauth verfügbar.
Referenzen
Siehe diese Change-Records für mehr Informationen:
- https://www.drupal.org/node/2720655 (login, login_status und logout)
- https://www.drupal.org/node/2752071 (Registrierung)
Für Authentifizierung kannst du auch andere Authentifizierungsprotokolle verwenden.
Wenn du dich für den "Cookie"-Weg mit einer JavaScript-Anwendung im Frontend und Drupal im Backend entscheidest, kann der Browser die Cookie-Speicherung für dich übernehmen. Vergiss nur nicht: Wenn deine JS-App und die Drupal-Seite unterschiedliche Domainnamen haben, musst du dem Browser erlauben, die Session-Cookies der Nutzer zu speichern, indem du den SameSite-Cookie-Parameter auf "None" setzt. Füge dazu in deiner services.yml
Datei folgendes hinzu:
parameters:
session.storage.options:
cookie_samesite: None
REST UI
Das REST UI Zusatzmodul ermöglicht die Konfiguration der Ressourcen des Core-REST-Moduls. So kannst du die Benutzerregistrierung mit diesem Modul aktivieren:
- Nach der Installation und Aktivierung des REST UI Moduls gehe zur Konfigurationsseite unter /admin/config/services/rest und aktiviere die "User registration" Ressource. Bearbeite die Ressource und aktiviere die POST-Methode, das JSON-Format und z.B. den Cookie-Provider. Durch Umschalten der Granularität auf "method" kannst du auch Formate und Provider pro Anfragemethode festlegen.
- Gewähre anonymen Benutzern die Berechtigung "Access POST on User registration resource" unter /admin/people/permissions/module/rest.
- Stelle sicher, dass Besucher ein Konto unter /admin/config/people/accounts anlegen können.
Artikel aus der Drupal Dokumentation.