Ajax呼び出しでノードを作成するにはどうすればよいですか?


7

カスタムフォームがモーダルで開かれ、送信時にajax関数を呼び出してRESTサービスにPOSTし、ノードを作成するサイトがあります。

問題は、送信時に「Forbidden」の応答が繰り返し表示されることです。

ログインしたユーザーだけがこれらのajaxリクエストを送信できるようにしたいのですが、authはユーザーごとに異なるトークンにする必要があります。

これが私のコードです:

$('#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);
        }
    });
}

POSTMANでテストを実行すると成功しますが、認証は少し異なります。 ここに画像の説明を入力してください

写真を見るとわかるように、ポストマンを使用すると201が作成されます。

Javascriptの実装で使用されているCSRFトークンに関係していると思います。JSを介して同じサイトにPOSTするときに使用する認証方法がわかりません。

こちらの情報を利用しました

CSRFトークンのチェックに成功し、アクセスを許可しているように見えるが、他の場所からアクセスが拒否されたため、バグレポートを作成しました。 問題#2831251 ajax POSTリクエストでRESTを介してノードを作成しようとすると、403応答が返される

回答:


2

(テスト目的で)任意のサイトに対してPOST、GET、PATCH、DELETEを実行できるGoogle ChromeブラウザアプリであるPostmanを使用して、コードを生成できます。

ここに画像の説明を入力してください

写真に示されている3つのステップを完了した後、さらに1つのステップを実行する必要があります。

  1. 次に、コードをカスタムモジュールに貼り付けます。

PS:postman-token行を削除できると思いますheaders


それはすばらしいことですが、管理者の資格情報によって生成された「基本」トークン認証に誰もがアクセスできるようにしたくありません。匿名ユーザー用ではなく、ユーザーごとに生成する必要があります。
CR47

@ CR47おそらくログインしていなくても、基本認証のデータを抽出できると思います。Cookie 認証独自のカスタム認証
Juraj Nemec

@JurajNemec Cookieはデフォルトでajaxリクエストで送信されます。また、コアのバグと思われるものに問題を絞り込みました。CSRFトークンのチェックは実際に成功し、チェーン内のどこかで失敗が発生しています。これは、これまでは見つけることができませんでした。drupal.orgのバグレポートへのリンクを使用して質問を更新しました。
CR47、2016年

この郵便配達員について聞いたことがありません、(映画のように)「常に2回鳴る」のですか?それについて少し説明/紹介するためにそれについていくつかの詳細を追加していただけませんか?PS:私はあなたの答えの" 4. "を理解していません...
Pierre.Vriens

1
POSTMANリクエストが成功したことについての私の言及は、エンドポイントが実際に機能するかどうかを確認するためのテストの詳細でした。問題は、質問に記載されている認証です。この場合、すべてのユーザーに対してすべてのリクエストでハッシュ化された管理者のユーザー名/パスワードを送信することはオプションではないため、この回答は当面の問題の解決には役立ちません。drupal.orgの問題へのリンクを、詳細を説明するのに役立つ質問に追加しました。
CR47 '29年

2

この問題は、D8のRest UIモジュールv.1.13のバグが原因でした。

これを書いている時点では、問題はモジュールで解決されていませんが、回避策があります。

この問題を回避するには、Rest UIからエクスポートされた構成を「認証」で調整する必要があります。

詳しくはこちらをご覧ください:https : //www.drupal.org/node/2831716#comment-11813802

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.