Rails 3 devise 401 несанкционированный вызов ajax - PullRequest
3 голосов
/ 25 марта 2012

У меня возникла проблема, похожая на этот вопрос: jQuery Ajax вызывает в Rails 3 получение 401 неавторизованного запроса

Я добавил token_authenticatable в мою модель устройства.

В моем действии для вызова ajax:

def rate
  params[:kon][:IP] = request.remote_ip
  params[:kon][:tag_id] = params[:id]
  @konkurrencer = Tagrating.new(params[:kon])
  @konkurrencer.save
  @konkurrencer.tag.rating_score += params[:kon][:ratings].to_i
  @konkurrencer.tag.ratings += 1
  @konkurrencer.save
  render :nothing => true
 end

Как мне аутентифицировать вызов ajax?

Как получить токен-ключ для текущего пользователя. Я пробовал: <%= current_user.token_authentication_key %>

Ответы [ 3 ]

14 голосов
/ 11 января 2013

Автор написал, что это проблема с токеном CSRF.Пока опубликованное решение работает, оно небезопасно.В этом вопросе было предложено лучшее решение: https://stackoverflow.com/a/8175979/696610

Я копирую его здесь:

Вы должны сделать это:

  1. Убедитесь, что в вашем макете <%= csrf_meta_tag %>

  2. Добавьте beforeSend ко всем запросам ajax для установки заголовка, как показано ниже:


$.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);
  }
});

Кредит https://stackoverflow.com/users/1052893/chau-hong-linh за ответ.

1 голос
/ 25 марта 2012

Это было не устройство, дающее авторизованную ошибку 401, а токен CSRF.

Просто отключил его для моего действия:

protect_from_forgery :except => :rate
0 голосов
/ 13 февраля 2014

Другой способ, если у вас есть только доступ к URL (скажем, вы используете плагин)

  var csrf_token = $('meta[name=csrf-token]').attr('content');
  var csrf_param = $('meta[name=csrf-param]').attr('content');
  var params;
  if (csrf_param !== undefined && csrf_token !== undefined) {
    params = csrf_param + "=" + encodeURIComponent(csrf_token);
  }

  var url = "/your/path?" + params 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...