Ich bin neu in den Diensten- und rest_server-Modulen (und den RESTful-APIs insgesamt). Nach meinem Verständnis sind die Schritte im Wesentlichen folgende:
- Senden Sie eine Post-Anfrage an / api / user / login mit dem in den Daten festgelegten Benutzernamen und Passwort
- Speichern Sie das Token, das Sie in der Antwort erhalten
- Fügen Sie bei nachfolgenden Post-Anforderungen das Token mit dem Schlüssel X-CSRF-TOKEN zum Header hinzu
Wenn ich dazu die Postman Chrome-Erweiterung verwende, funktioniert das hervorragend. Wenn ich es im Code mache, funktioniert api / user / login in Ordnung, ich erhalte das Token, aber wenn ich versuche, auf / api / other / endpoint zuzugreifen, wird 403 Zugriff für anonymen Benutzerfehler verweigert.
Die erste Anfrage (/ user / login) sieht folgendermaßen aus:
POST /api/user/login HTTP/1.0
Content-Type: application/json
Accept: application/json
User-Agent: Drupal (+http://drupal.org/)
Host: mysiteurl.com
Content-Length: 41
{"username":"NAME","password":"PASSWORD"}
Und die zweite Anfrage (/ other / endpoint) sieht folgendermaßen aus:
POST /api/other/endpoint HTTP/1.0
Content-Type: application/json
Accept: application/json
X-CSRF-TOKEN: vGJm5GNDGumf-SoHnLsBU6d46EkrOZkvUY0CSa08GA0
User-Agent: Drupal (+http://drupal.org/)
Host: mysiteurl.com
Content-Length: 0
Wenn ich nach der Authentifizierung Anfragen an / user / token stelle, erhalte ich jedes Mal neue Token. Wenn ich versuche, mich sofort nach dem Anmelden abzumelden (und dieses Token mitzusenden), erhalte ich die Meldung "406 nicht akzeptabel: Benutzer ist nicht angemeldet". Error. Es sagt mir, dass der Benutzer nicht angemeldet ist.
Wenn ich die Site jedoch überprüfe, wird dem Benutzer angezeigt, dass er sich erfolgreich angemeldet hat und nachträglich noch angemeldet ist.
Muss ich etwas bezüglich des Sitzungsnamens / der ID oder des Cookies speichern / senden? Alles, was ich mir angesehen habe, deutet darauf hin, dass nur das Sitzungstoken erforderlich ist.
Session authentication
unteradmin/structure/services/list/[my-endpoint]
und alle Caches gelöscht?Antworten:
(Beantworte meine eigene Frage und versuche, wie ein Dritter zu klingen, damit es beim Lesen sinnvoller ist ...)
Es sieht so aus, als hätte es definitiv etwas mit der Sitzung / dem Cookie / etc. Zu tun, da nachfolgende Aufrufe von einem anderen Client zu kommen scheinen (aus Sicht des REST-Servers). Ich vermute, dass nacktes PHP keine Möglichkeit hat, dieses Cookie zu verwalten , wie ein Browser würde. Nachdem Sie hier nachgesehen haben , sieht es so aus, als müsste das Cookie im Header der Anfrage als solches formatiert werden:
(Das Cookie kann auch aus der Variablen headers-> set_cookie der Antwort abgerufen werden. Letztere enthält auch alle Ablauf- / Linkinformationen in der Zeichenfolge. Obwohl beide Methoden zu funktionieren scheinen, bin ich mir nicht sicher, ob es Fehler gibt. Effekte von der einen oder anderen. Ich habe gerade die erste Methode verwendet, weil es die erste Lösung war, auf die ich gestoßen bin.)
Sowohl session_name als auch sessid können nach einer Benutzer- / Anmeldeanforderung aus dem Datenbereich der Antwort entnommen werden. Die Anfrage würde also letztendlich für einen Benutzer / Abmelden ungefähr so aussehen
quelle
POST /entity/node...
), aber die nachfolgenden Bearbeitungsanforderungen (PATCH /node/123
oderDELETE /node/123
) schlagen mit einem 403 fehl. Die Basisauthentifizierung ist für Inhaltsrouten in der REST-Konfiguration aktiviert.Hatte das gleiche Problem zuvor beim Versuch, sich anzumelden oder das X-CSRF-Token (/ services / session / token) über die API abzurufen, ändert es das Token jedes Mal bei Aktualisierung oder auf Anfrage. Meine Lösung besteht darin, withCredentials vor der Post-Anfrage auf true zu setzen. Nachdem ich es eingestellt habe, kann die Seite jetzt das Sitzungscookie lesen
Beispiel xhr.withCredentials = true;
oder in meinem Fall mit Vue
quelle