it-swarm.com.de

Authentifizierte REST Anfragen werden anonymer Benutzer

Ich bin neu in den Modulen services und rest_server (und den RESTful-APIs insgesamt). Nach meinem Verständnis lauten die Schritte im Wesentlichen wie folgt:

  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 einwandfrei, ich bekomme das Token, aber wenn ich es versuche access/api/other/endpoint, ich erhalte 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.

7
UnsettlingTrend

(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 der Perspektive des REST Servers). Ich vermute bare PHP hat keine Möglichkeit, dieses Cookie so zu verwalten, wie es ein Browser tun würde. Nachdem Sie hier angesehen haben, sieht es so aus, als müsste das Cookie im Header als solches formatiert werden der Anfrage:

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
2
UnsettlingTrend

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();
});
0
Jry