Authentifizierte REST-Anforderungen werden zu anonymen Benutzern

7

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:

  1. Senden Sie eine Post-Anfrage an / api / user / login mit dem in den Daten festgelegten Benutzernamen und Passwort
  2. Speichern Sie das Token, das Sie in der Antwort erhalten
  3. 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.

UnsettlingTrend
quelle
Haben Sie Session authenticationunter admin/structure/services/list/[my-endpoint]und alle Caches gelöscht?
tyler.frankenstein
Ja und ja. Ich glaube nicht, dass es in Postman funktioniert hätte, wenn ich die Sitzungsauthentifizierung nicht bereits aktiviert hätte.
UnsettlingTrend
Ok, ich habe nur Erfahrung mit Browsern, in denen das Cookie automatisch bearbeitet wird. Ich denke, Sie müssen auch die Sitzungs-ID im Header mitsenden, wenn Sie den Anruf von einer Nicht-JS-Umgebung (z. B. PHP) aus tätigen. Welchen Code verwenden Sie, um den Anruf zu tätigen?
tyler.frankenstein
Ganz PHP. Wenn ich die Sitzungs-ID hinzufügen muss, füge ich sie dem Header hinzu? Und was wäre der Schlüssel; Sitzung / Sitzungs-ID / Sitzungs-ID / etc? Ich habe jede erdenkliche Kombination mit den gleichen Ergebnissen ausprobiert.
UnsettlingTrend

Antworten:

2

(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:

Cookie: session_name=sessid

(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

POST /api/user/logout HTTP/1.0
Content-Type: application/json
Accept: application/json
X-CSRF-Token: igHUQD11Y8LYdyzHi8m5t33U_tCVZNHE6BbptE4mrwQ
Cookie: SESSd3a1acd26f95229c67cd0a9a1e455bd4=rv-Kbyb8znaGlYBBU5Dn7M2GzkYdWnun5aXcVYLVfvY
User-Agent: Drupal (+http://drupal.org/)
Host: mysiteurl.com
Content-Length: 0
UnsettlingTrend
quelle
Ich habe ein ähnliches Problem, verwende aber Basic Auth zum Testen. Ich kann einen Knoten in Ordnung erstellen ( POST /entity/node...), aber die nachfolgenden Bearbeitungsanforderungen ( PATCH /node/123oder DELETE /node/123) schlagen mit einem 403 fehl. Die Basisauthentifizierung ist für Inhaltsrouten in der REST-Konfiguration aktiviert.
Aalaap
0

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

Vue.http.interceptors.push((request, next) => {
    request.credentials = true;
    next();
});
Jry
quelle