カスタムフォームがモーダルで開かれ、送信時に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応答が返される