ВНИМАНИЕ: Невозможно проверить рельсы подлинности токена CSRF. - PullRequest
230 голосов
/ 26 августа 2011

Я отправляю данные из представления на контроллер с AJAX, и я получил эту ошибку:

ПРЕДУПРЕЖДЕНИЕ: не удается проверить подлинность токена CSRF

Я думаю, что долженотправьте этот токен с данными.

Кто-нибудь знает, как я могу это сделать?

Редактировать: Мое решение

Я сделал это, поставив следующеекод внутри поста AJAX:

headers: {
  'X-Transaction': 'POST Example',
  'X-CSRF-Token': $('meta[name="csrf-token"]').attr('content')
},

Ответы [ 17 ]

4 голосов
/ 31 марта 2017

Используйте jquery.csrf (https://github.com/swordray/jquery.csrf).

  • Rails 5.1 или более поздней версии

    $ yarn add jquery.csrf
    
    //= require jquery.csrf
    
  • Rails 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);
    

3 голосов
/ 25 апреля 2012

Если вы используете javascript с jQuery для генерации токена в вашей форме, это работает:

<input name="authenticity_token" 
       type="hidden" 
       value="<%= $('meta[name=csrf-token]').attr('content') %>" />

Очевидно, вам нужно иметь <%= csrf_meta_tag %> в вашем макете Ruby.

3 голосов
/ 05 сентября 2016

Если вы не используете 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)
    })
2 голосов
/ 29 октября 2013

Для тех из вас, кому нужен ответ не от 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();
1 голос
/ 13 января 2013

, если кому-то нужна помощь, связанная с Uploadify и Rails 3.2 (как и я, когда я погуглил этот пост), этот пример приложения может быть полезен: https://github.com/n0ne/Uploadify-Carrierwave-Rails-3.2.3/blob/master/app/views/pictures/index.html.erb

также проверьте решение контроллера в этом приложении

1 голос
/ 06 февраля 2018

Я боролся с этой проблемой в течение нескольких дней.Любой вызов GET работал правильно, но все PUT генерировали ошибку «Не удается проверить подлинность токена CSRF».Мой веб-сайт работал нормально, пока я не добавил сертификат SSL в nginx.

Я наконец наткнулся на эту недостающую строку в моих настройках 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 прекратились.

Надеюсь, это поможет кому-то еще, кто также бьет головой о стену.ха-ха

0 голосов
/ 12 ноября 2015

Я использую Rails 4.2.4 и не могу понять, почему я получаю:

Can't verify CSRF token authenticity

У меня в макете:

<%= csrf_meta_tags %>

В контроллере:

protect_from_forgery with: :exception

Invoking 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, поэтому это еще одна возможная причина, если вы видите эту ошибку.

...