私は、フォームの提出を希望するCDNレベルでキャッシュされたページを持っています。非同期にレール認証トークンを設定します
私は非同期にCSRFのメタタグを取得し、フォームで渡ってそれらを送信するためにtechnique 3 of this post続いてきたが、私はこれをしようとすると、私はフォーム送信コントローラのアクションにActionController::InvalidAuthenticityToken
を取得しています。すべてがうまくいくようですが、フォームはまだ拒否されています。
def csrf_meta
respond_to do |format|
format.json do
render json: {
param: request_forgery_protection_token,
token: form_authenticity_token
}
end
end
end
そして、ここでここで<head>
function asyncCsrf() {
window.fetch("/async_info/csrf_meta")
.then(function(response) {
response.json().then(function(json) {
console.log(json);
var meta = document.createElement('meta');
meta.name = "csrf-param";
meta.content = json.param;
document.getElementsByTagName('head')[0].appendChild(meta);
var meta = document.createElement('meta');
meta.name = "csrf-token";
meta.content = json.token;
document.getElementsByTagName('head')[0].appendChild(meta);
});
}).catch(function(err) {
console.log(err);
});
}
にそれを追加するJS関数は、フォームに真正トークンを追加するJSです:ここで
は、CSRFの情報を提供する行為があります
var authToken = document.querySelector("meta[name='csrf-token']").getAttribute("content");
// later:
<input type="hidden" name="authenticity_token" value="'+authToken+'">
すべてが存在するようです。トークンはフォームと共に渡されますが、それにもかかわらずActionController::InvalidAuthenticityToken
が残ります。
リンクする代わりに、使用しているコードを表示できますか? –
@maxpleanerええ。コードを追加しました。私のコードは、jQueryの代わりにバニラjsを除くリンクされたものとほとんど同じです。 – spitfire109