Wie kann ich einen Knoten über einen Ajax-Aufruf erstellen?

7

Ich habe eine Site, auf der ein benutzerdefiniertes Formular in einem Modal geöffnet ist, und ruft beim Senden eine Ajax-Funktion zum POST an einen REST-Service auf, um einen Knoten zu erstellen.

Das Problem ist, dass ich bei der Einreichung immer wieder die Antwort "Verboten" erhalte.

Ich möchte nur, dass angemeldete Benutzer diese Ajax-Anforderungen senden können und die Authentifizierung für jeden Benutzer ein anderes Token sein sollte.

Hier ist mein Code:

$('#create-node-submit').click(function(e) {
    e.preventDefault();
    var newNode = {
        _links: {
            type: {
                href: 'http://mysite.dev/rest/type/node/article'
            }
        },
        type: {
            target_id: 'article'
        },
        title: {
            value: 'This is a test Article from REST'
        },
        field_description: {
            value: 'Here is some test description.'
        }
    };
    getCsrfToken(function (csrfToken) {
        postNode(csrfToken, newNode);
    });

    return false;
});

function getCsrfToken(callback) {
    $.get(Drupal.url('rest/session/token'))
        .done(function (data) {
            var csrfToken = data;
            callback(csrfToken);
        });
}

function postNode(csrfToken, node) {
    $.ajax({
        url: 'http://mysite.devdev/entity/node?_format=hal_json',
        method: 'POST',
        headers: {
            'Content-Type': 'application/hal+json',
            'X-CSRF-Token': csrfToken
        },
        data: JSON.stringify(node),
        success: function (node) {
            console.log(node);
        },
        error: function (XMLHttpRequest, textStatus, errorThrown) {
            console.log("Status: " + textStatus);
            console.log("Error: " + errorThrown);
        }
    });
}

Wenn ein Test in POSTMAN ausgeführt wird, ist er erfolgreich, aber die Authentifizierung war dort etwas anders: Geben Sie hier die Bildbeschreibung ein

Wie Sie auf dem Bild sehen können, wird bei Verwendung von POSTMAN 201 erstellt.

Ich glaube, das hat mit dem CSRF-Token zu tun, das in der Javascript-Implementierung verwendet wird. Ich bin mir nicht sicher, welche Authentifizierungsmethode ich verwenden soll, wenn ich über JS auf dieselbe Site poste.

Ich habe die Informationen hier verwendet .

Ich habe einen Fehlerbericht erstellt, da die CSRF-Token-Prüfung anscheinend erfolgreich bestanden wurde und Zugriff gewährt, der Zugriff jedoch von einem anderen Ort aus verweigert wird. Problem # 2831251 Der Versuch, Knoten über REST mit einer Ajax-POST-Anforderung zu erstellen, gibt eine 403-Antwort zurück

CR47
quelle

Antworten:

2

Sie können Postman verwenden , eine Google Chrome-Browser-App, mit der Sie auf jeder Website (zu Testzwecken) POST, GET, PATCH und DELETE erstellen können, um den Code für Sie zu generieren:

Geben Sie hier die Bildbeschreibung ein

Nachdem Sie die 3 im Bild gezeigten Schritte ausgeführt haben, müssen Sie einen weiteren Schritt ausführen:

  1. Fügen Sie dann den Code in Ihr benutzerdefiniertes Modul ein.

PS: Ich glaube, Sie können die postman-tokenZeile in der löschen headers.

Kein Sssweat
quelle
Das ist großartig, aber ich möchte nicht, dass jeder Zugriff auf diese "Basic" -Tokenauthentifizierung hat, die von den Administratoranmeldeinformationen generiert wurde. Es sollte für jeden Benutzer und überhaupt nicht für anonyme Benutzer generiert werden.
CR47
@ CR47 Ich glaube nicht, dass Sie Daten für die Basisauthentifizierung extrahieren können, wenn Sie bereits angemeldet sind. Es scheint, dass Sie eine andere Authentifizierungsmethode verwenden müssen, z. B. die Cookie-Authentifizierung oder Ihre eigene benutzerdefinierte Authentifizierung
Juraj Nemec,
@JurajNemec Das Cookie wird standardmäßig mit einer Ajax-Anfrage gesendet. Ich habe das Problem auch auf einen Fehler im Kern eingegrenzt. Die CSRF-Token-Prüfung besteht tatsächlich, und irgendwo in der Kette tritt ein Fehler auf, den ich bisher nicht finden konnte. Ich habe die Frage mit einem Link zum Fehlerbericht auf drupal.org aktualisiert.
CR47
Noch nie von diesem Postboten gehört , klingelt er "immer zweimal" (wie im Film)? Würde es Ihnen etwas ausmachen, einige Details hinzuzufügen, um es ein wenig zu erklären / einzuführen? PS: Ich verstehe die " 4. " in Ihrer Antwort nicht ...
Pierre.Vriens
1
Meine Erwähnung des Erfolgs der POSTMAN-Anfrage war eher ein Test, um festzustellen, ob der Endpunkt tatsächlich funktioniert hat. Das Problem ist die Authentifizierung, wie in der Frage beschrieben. Das Senden des Benutzernamens / Passworts des Hash-Administrators in jeder Anfrage für alle Benutzer ist in diesem Fall keine Option, daher hilft diese Antwort nicht wirklich, das vorliegende Problem zu lösen. Ich habe einen Link zu dem Problem auf drupal.org zu der Frage hinzugefügt, der mehr erklärt.
CR47
2

Das Problem war auf einen Fehler im Rest UI-Modul v.1.13 für D8 zurückzuführen.

Zum Zeitpunkt des Schreibens ist das Problem auf dem Modul nicht behoben, es gibt jedoch eine Problemumgehung.

Um das Problem zu umgehen, müssen aus der Rest-Benutzeroberfläche exportierte Konfigurationen unter "Authentifizierung" angepasst werden.

Weitere Informationen finden Sie hier: https://www.drupal.org/node/2831716#comment-11813802

CR47
quelle