AJAXでビューからコントローラにデータを送信していますが、このエラーが発生しました。
警告:CSRFトークンの信憑性を確認できません
このトークンをデータと一緒に送信する必要があると思います。
誰もが私がこれを行うことができる方法を知っていますか?
編集:私の解決策
私はAJAX投稿の中に次のコードを入れることによってこれをしました:
headers: {
'X-Transaction': 'POST Example',
'X-CSRF-Token': $('meta[name="csrf-token"]').attr('content')
},
これをするべきです:
レイアウトに<%= csrf_meta_tag %>
があることを確認してください。
以下のようにヘッダを設定するためにすべてのajaxリクエストにbeforeSend
を追加します。
$.ajax({ url: 'YOUR URL HERE',
type: 'POST',
beforeSend: function(xhr) {xhr.setRequestHeader('X-CSRF-Token', $('meta[name="csrf-token"]').attr('content'))},
data: 'someData=' + someData,
success: function(response) {
$('#someDiv').html(response);
}
});
あなたが使用することができるすべての要求でトークンを送るために:
$.ajaxSetup({
headers: {
'X-CSRF-Token': $('meta[name="csrf-token"]').attr('content')
}
});
これを行う最良の方法は、実際には<%= form_authenticity_token.to_s %>
を使用してトークンを直接Railsコードに出力することです。他の記事が述べているようにcsrfトークンのためにDOMを検索するのにjavascriptを使用する必要はありません。下記のようにheadersオプションを追加するだけです。
$.ajax({
type: 'post',
data: $(this).sortable('serialize'),
headers: {
'X-CSRF-Token': '<%= form_authenticity_token.to_s %>'
},
complete: function(request){},
url: "<%= sort_widget_images_path(@widget) %>"
})
私の記憶が正しければ、この問題を解決するには、フォームに次のコードを追加する必要があります。
<%= token_tag(nil) %>
パラメータを忘れないでください。
本当に簡単な方法です。ヘッダーを変更しても気にしないでください。
あなたが持っていることを確認してください:
<%= csrf_meta_tag %> in your layouts/application.html.erb
隠された入力フィールドを以下のようにするだけです。
<input name="authenticity_token"
type="hidden"
value="<%= form_authenticity_token %>"/>
あるいは、jQueryのAjax投稿が必要な場合は、
$.ajax({
type: 'POST',
url: "<%= someregistration_path %>",
data: { "firstname": "text_data_1", "last_name": "text_data2", "authenticity_token": "<%= form_authenticity_token %>" },
error: function( xhr ){
alert("ERROR ON SUBMIT");
},
success: function( data ){
//data response can contain what we want here...
console.log("SUCCESS, data="+data);
}
});
Csrfメタタグを含めて、古いアプリからRails 3.1にアップグレードしてもまだ解決していません。 rubyonrails.orgブログでは、いくつかのアップグレードのヒント、具体的にはあなたのレイアウトのヘッドセクションに入るべきjqueryのこの行を示しています。
$(document).ajaxSend(function(e, xhr, options) {
var token = $("meta[name='csrf-token']").attr("content");
xhr.setRequestHeader("X-CSRF-Token", token);
});
このブログ記事から取られた: http://weblog.rubyonrails.org/2011/2/8/csrf-protection-bypass-in-Ruby-on-Rails 。
私の場合、セッションはajaxリクエストごとにリセットされていました。上記のコードを追加することでその問題は解決しました。
<%= csrf_meta_tag %>
があることを確認してください。beforeSend
を追加します。これはpost
リクエストにのみ必要です。Csrf-tokenを読むためのコードはRails/jquery-ujs
にありますので、次のようにそれを使うのが最も簡単です:
$.ajax({
url: url,
method: 'post',
beforeSend: $.Rails.CSRFProtection,
data: {
// ...
}
})
この記事にはあなたが探している答えのほとんどが含まれているので、ここでここにリンクさせることを考えていました。それはまた非常に興味深いものです。
JQueryにセッションCookieを渡すように明示的に指示しない限り、セッションは利用できないため、ここでのトップ投票の回答は正しいですが、クロスドメインリクエストを実行している場合は機能しません。これを行う方法は次のとおりです。
$.ajax({
url: url,
type: 'POST',
beforeSend: function(xhr) {
xhr.setRequestHeader('X-CSRF-Token', $('meta[name="csrf-token"]').attr('content'))
},
xhrFields: {
withCredentials: true
}
});
以下のようにグローバルに書くことができます。
通常のJS:
$(function(){
$('#loader').hide()
$(document).ajaxStart(function() {
$('#loader').show();
})
$(document).ajaxError(function() {
alert("Something went wrong...")
$('#loader').hide();
})
$(document).ajaxStop(function() {
$('#loader').hide();
});
$.ajaxSetup({
beforeSend: function(xhr) {xhr.setRequestHeader('X-CSRF-Token', $('meta[name="csrf-token"]').attr('content'))}
});
});
コーヒースクリプト:
$('#loader').hide()
$(document).ajaxStart ->
$('#loader').show()
$(document).ajaxError ->
alert("Something went wrong...")
$('#loader').hide()
$(document).ajaxStop ->
$('#loader').hide()
$.ajaxSetup {
beforeSend: (xhr) ->
xhr.setRequestHeader('X-CSRF-Token', $('meta[name="csrf-token"]').attr('content'))
}
おっとっと..
私は私のapplication.jsで次の行を逃しました
//= require jquery_ujs
私はそれとその作業を交換しました..
=======更新=========
5年後、私は同じエラーで戻ってきました、今私は真新しいRails 5.1.6を持っています、そして私は再びこの記事を見つけました。人生の輪のように。
問題は次のとおりです。Rails 5.1では、jqueryおよびのサポートが削除されました)jquery_ujsをデフォルトで追加
//= require Rails-ujs in application.js
以下のことを行います。
しかし、なぜそれがajaxリクエスト用のcsrfトークンを含まないのですか?誰かがこれについて詳細に知っているならば、ただ私にコメントしてください。感謝します。
とにかく私はそれを動作させるために私のカスタムjsファイルに以下を追加しました(私がこのコードに達するのを助けるために他の答えをありがとう):
$( document ).ready(function() {
$.ajaxSetup({
headers: {
'X-CSRF-Token': Rails.csrfToken()
}
});
----
----
});
Jquery.csrf( https://github.com/swordray/jquery.csrf )を使用してください。
レール5.1以降
$ yarn add jquery.csrf
//= require jquery.csrf
5.0以前のレール
source 'https://Rails-assets.org' do
gem 'Rails-assets-jquery.csrf'
end
//= require jquery.csrf
ソースコード
(function($) {
$(document).ajaxSend(function(e, xhr, options) {
var token = $('meta[name="csrf-token"]').attr('content');
if (token) xhr.setRequestHeader('X-CSRF-Token', token);
});
})(jQuery);
あなたのフォームにトークンを生成するためにjQueryと共にjavascriptを使用しているなら、これは動作します:
<input name="authenticity_token"
type="hidden"
value="<%= $('meta[name=csrf-token]').attr('content') %>" />
明らかに、あなたはあなたのRubyレイアウトに<%= csrf_meta_tag %>
を持つ必要があります。
JQueryを使用しておらず、リクエストに fetch APIのようなものを使用している場合は、以下を使用してcsrf-token
を取得できます。
document.querySelector('meta[name="csrf-token"]').getAttribute('content')
fetch('/users', {
method: 'POST',
headers: {
'Accept': 'application/json',
'Content-Type': 'application/json',
'X-CSRF-Token': document.querySelector('meta[name="csrf-token"]').getAttribute('content')},
credentials: 'same-Origin',
body: JSON.stringify( { id: 1, name: 'some user' } )
})
.then(function(data) {
console.log('request succeeded with JSON response', data)
}).catch(function(error) {
console.log('request failed', error)
})
あなたがjQuery以外の答えを必要としていないあなたのためにあなたは簡単に以下を追加することができます:
xmlhttp.setRequestHeader( 'X-CSRF-Token'、$( 'meta [name = "csrf-token"]')。attr( 'content'));
非常に単純な例はここで見られることができます:
xmlhttp.open( "POST"、 "example.html"、true); xmlhttp.setRequestHeader( 'X-CSRF-Token'、$( 'meta [name = "csrf-token] "] ')。attr(' content ')); xmlhttp.send();
誰かがUploadifyとRails 3.2に関連した助けを必要とするなら(私がこの記事をグーグルしたときのように)、このサンプルアプリは役に立つかもしれません: https://github.com/n0ne/Uploadify-Carrierwave-Rails-3.2.3 /blob/master/app/views/pictures/index.html.erb
このアプリのコントローラーソリューションもチェックしてください
私はこの問題に何日も苦労しました。どのGET呼び出しも正しく機能していましたが、すべてのPUTが「CSRFトークンの信頼性を検証できません」というエラーを生成しました。私のウェブサイトは私がnginxにSSL証明書を追加するまでは問題なく動作していました。
私はついに私のnginxの設定でこの行方不明の行につまずいた:
location @puma {
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_Host;
proxy_redirect off;
proxy_set_header X-Forwarded-Proto https; # Needed to avoid 'WARNING: Can't verify CSRF token authenticity'
proxy_pass http://puma;
}
足りない行 "proxy_set_header X-Forwarded-Proto https;"を追加すると、私のCSRFトークンエラーはすべて終了します。
うまくいけば、これは他の誰かが壁に対して頭を叩いているのに役立ちます。はは
私はRails 4.2.4を使用していますが、次のようになっている理由を理解できませんでした。
Can't verify CSRF token authenticity
私はレイアウトにあります:
<%= csrf_meta_tags %>
コントローラで:
protect_from_forgery with: :exception
tcpdump -A -s 999 -i lo port 3000
を呼び出すと、設定されているヘッダーが表示されていました(ajaxSetup
を使用してヘッダーを設定する必要はありませんが、既に行われています)。
X-CSRF-Token: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
X-Requested-With: XMLHttpRequest
DNT: 1
Content-Length: 125
authenticity_token=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
結局、クッキーをオフにしていたので失敗しました。 CSRFはCookieが有効になっていないと機能しません。そのため、このエラーが表示された場合はこれも考えられる原因です。