web-dev-qa-db-ja.com

AJAX to Railsで認証トークンを送信する適切な方法

これは機能しますが、認証トークンがないため停止します。

$(".ajax-referral").click(function(){
  $.ajax({type: "POST", url: $(this).parent("form").attr("action"), dataType: "script"});
  return false;
});

だから私はそれを次のように追加しようとしました:

$(".ajax-referral").click(function(){
  $.ajax({type: "POST", url: $(this).parent("form").attr("action") + "?&authenticity_token=" + AUTH_TOKEN, dataType: "script"});
  return false;
});

そして、auth_tokenをパラメーターとして正しく渡しますが、フォームの残りを失うようです。

とにかく動作するフォームデータと認証トークンの両方を送信するにはどうすればいいですか?

これはRails環境です。これは私の頭の中にあります。

= javascript_tag "var AUTH_TOKEN = '#{form_authenticity_token}';" if protect_against_forgery?

試したこと

1。

= hidden_field :authenticity_token, :value => form_authenticity_token

2。

$.ajax({type: "POST", url: $(this).parent("form").attr("action"), dataType: "script", authenticity_token: AUTH_TOKEN});

3。

// Always send the authenticity_token with ajax
$(document).ajaxSend(function(event, request, settings) {
    if ( settings.type != 'GET' ) {
        settings.data = (settings.data ? settings.data + "&" : "")
            + "authenticity_token=" + encodeURIComponent( AUTH_TOKEN );
    }
});
38
Trip

実際には、フォームのaction属性を読み取り、そこにpost ajaxリクエストを送信しています。フォームデータを送信するには、フォームを送信する必要があります。または、フォームデータをシリアル化し、次のようなajaxリクエストで送信することができます

$(".ajax-referral").click(function(){
  $.ajax({
      type: "POST", 
      url: $(this).parent("form").attr("action") + "?&authenticity_token=" + AUTH_TOKEN, 
      data:$(this).parent("form").serialize(),
      dataType: "script"
      });
  return false;
});

これを行うと、フォームデータがシリアル化され、ajaxリクエストとともに送信されます。認証トークンは既にクエリ文字列を介して送信されています

31

このトークンは、先頭に次のERBがある場合、デフォルトでapplication.html.erbレイアウトファイルの先頭にある「メタ」タグのいずれかに既に表示されています。

<%= csrf_meta_tag %>

そのERBは大まかに次のようにレンダリングされます。

<meta content="abc123blahblahauthenticitytoken" name="csrf-token">

その後、次のコードでjQueryを使用して取得できます。

var AUTH_TOKEN = $('meta[name=csrf-token]').attr('content');
30
omdel

これらのいずれも、次のようにJSを介して要求ヘッダーに_X-CSRF-Token_値を設定するまでは機能しませんでした。

_request.setRequestHeader('X-CSRF-Token', token)
_

tokenはもちろん、CSRFトークンです。これを_<meta name="csrf-token">_タグから取得し、encodeURIComponent()を使用しませんでした

更新これは一部の人にとって有用であることが証明されているため

全体として:

_var token = document.querySelector('meta[name="csrf-token"]').content
request.setRequestHeader('X-CSRF-Token', token)
_
20
Adam Grant

ありがとう!

より一般的な使用法を明確にするためです。

頭にvar AUTH_TOKENを含むjsタグが必要です。このようなものでなければなりません。

<%= csrf_meta_tag %>
<%= javascript_tag "var AUTH_TOKEN = '#{form_authenticity_token}';" if protect_against_forgery? %>

そして、parent(form)またはこのようなものを使用する必要がない場合は、単にajaxデータにauthenticity_token = AUTH_TOKENを入力します。

$.ajax({
  type: 'post',
  dataType:'text',
  data: "user_id="+user_id+"&authenticity_token="+AUTH_TOKEN,
  url:'/follow/unfollow'
})

この知識を共有してくれた上記の人々に感謝します!

15
Yavor Ivanov

私はこの問題に遭遇しましたが、application.jsファイルでこのアプローチを試しました。

$(document).ajaxSend(function(e, xhr, options) {
  if (options.data == null) {
    options.data = {};
  }
  options.data['authenticity_token'] = token;
});

これは私がアイデアを得た元の質問です: ajaxSend Question

3
carnator

非表示の入力として、フォーム自体にAUTH_TOKENを含めることができます。

<input type="hidden" name="AUTH_TOKEN">1234abcd</input>
3
BishopRook

Rails 5.1+組み込みのRails JSヘルパーをAJAX requests(from Rails-ujs)、例:

Rails.ajax({
  url: "/your/url",
  type: "POST",
  data: "a=1&b=2",
  success: function(data) {
    console.log(data);
  }
});

このライブラリは、必要に応じてCSRFトークンを手動で取得するためのヘルパーも提供します。

Rails.csrfToken();
0

Form_tagを使用するだけで、CSRFトークンパラメータが自動的に含まれます。 Railsは「控えめなJavascript」をサポートします。これは、フォームが引き続きAJAX経由で送信されることを意味します。コントローラーアクションは「respond_to」ブロックをサポートします。フォーム送信に応じて。

0
wondersz1