it-swarm.com.de

Wie melde ich mich mit REST ab?

Ich erstelle eine mobile App in Ionic (verwendet Angular). Ich habe ein D8.3-dev BE eingerichtet, das die Benutzer und ihre Daten enthält.

Ich habe herausgefunden, wie ich mich als anonymer Benutzer registrieren kann (aus diesem Grund verwende ich D8.3-dev, weil diese Funktionalität hier eingeführt wird) und einen Blog-Beitrag darüber geschrieben ( https: // fonsvandamme). be/de/blog/how-create-user-rest-drupal-8 ).

Das Anmelden funktioniert auch, nachdem ich einen Benutzer registriert habe.

So logge ich mich ein:

  /*
   * Login User with username and password.
   */
  login: function (email, password) {

    var defer = $q.defer();

    $http({
      method: 'POST',
      url: config.endpoint + '/user/login?_format=json',
      data: {
        name: email,
        pass: password
      },
    })
      .success(function (data, status, headers, config) {

        // Store the CSRF token.
        localStorage.set('csrf_token', data.csrf_token);

        // Store the Logout token
        localStorage.set('logout_token', data.logout_token);

        // Set the user object.
        localStorage.setObject('user', data.current_user);

        defer.resolve(data);
      })
      .error(function (data, status, headers, config) {
        defer.reject(data);
      });

    return defer.promise;
  },

Beim Einloggen erhalte ich folgendes:

aktuelles Benutzerobjekt, ein csrf_token und ein logout_token.

Wenn ich diese Token zum Abmelden verwende (ich habe bereits viele verschiedene Methoden ausprobiert:

  /*
   * Logout User.
   */
  logout: function () {

    var defer = $q.defer();

    $http({
      method: 'POST',
      url: config.endpoint + '/user/logout?_format=json&token=' + localStorage.get('csrf_token'),
      dataType: 'json',
    })
      .success(function (data, status, headers, config) {
        defer.resolve(data);

        // Go to the login page.
        $state.go("login");
      })
      .error(function (data, status, headers, config) {
        defer.reject(data);
      });

    return defer.promise;
  },

Ich erhalte immer wieder den folgenden Fehler:

{"message":"\u0027csrf_token\u0027 URL query argument is invalid."}

Es scheint also, dass das crsf_token, das ich beim Anmelden verwende, nicht korrekt ist.

Was mache ich falsch oder beaufsichtige ich hier?

EDIT: Nachdem ich viel getestet und versucht habe, scheint es, als müsste ich get verwenden. Ich verwende diesen Code jetzt zum Abmelden, erhalte aber immer noch eine 403:

  /*
   * Logout User.
   */
  logout: function () {

    var defer = $q.defer();

    $http({
      method: 'GET',
      url: config.endpoint + '/user/logout?_format=json',
      headers: {
        'X-CSRF-Token': localStorage.get('csrf_token'),
        'Authorization': 'Basic xxxxxxxxx',
      },
    })
      .success(function (data, status, headers, config) {
        defer.resolve(data);
      })
      .error(function (data, status, headers, config) {
        defer.reject(data);
      });

    return defer.promise;
  },

Hier ist, was der Drupal 8.3-dev BE zurückgibt, es scheint, als würde er den Benutzer erkennen, den ich abmelden möchte, aber er wirft immer noch den 403.

(enter image description here

3
Fons Vandamme

Um sich mit REST in Drupal 8) abzumelden, können Sie einfach einen [~ # ~] Beitrag [~ # ~] verfassen ] mit Content-type: application/json an:

https://example.com/user/logout?_format=json

Frühere Versionen von Drupal 8

Mach ein [~ # ~] get [~ # ~] auf ?q=user/logout

Dies wird in den JS D8 REST docs: https://www.drupal.org/docs/8/core/modules/rest/javascript-and-drupal-8) vermerkt -restful-web-services

Obwohl dies keine Rolle spielen sollte, muss Content-type Möglicherweise auf application/x-www-form-urlencoded Gesetzt werden.

Hier ist ein Beispiel für die Verwendung von jDrupal: https://github.com/signalpoint/jDrupal/blob/8.x-1.x/src/includes/rest.inc.js#L11

3

Es scheint jetzt zu funktionieren, nachdem ich dies in meine Angular App unter app.js) eingefügt habe

.config(['$httpProvider', function($httpProvider) {
    $httpProvider.defaults.withCredentials = true;
}])
1
Fons Vandamme