Rails 3 devise 401未授权的ajax调用

3

我有一个类似于这个问题的问题:jQuery Ajax calls in Rails 3 getting 401 Unauthorized Request

我已经在我的devise模型中添加了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

作者发帖称这是CSRF令牌问题。尽管发帖中提供的解决方案可行,但并不安全。在这个问题中提出了一个更好的解决方案:https://dev59.com/emw05IYBdhLWcg3wfx80#8175979

我将其复制在这里:

您应该这样做:

  1. 确保您的布局中有<%= csrf_meta_tag %>

  2. 为所有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);
  }
});

答案感谢https://stackoverflow.com/users/1052893/chau-hong-linh提供。


1
这是一个更好的解决方案。 - Josh Lehman
1
这个问题的被接受答案从安全角度来看是危险的。请使用这个答案代替! - Chris Hart

1

问题不是设备出现了401授权错误,而是CSRF令牌。

我只需禁用我的操作即可:

protect_from_forgery :except => :rate

这是否意味着您的请求操作不再安全?我不是专家,但这难道不是一个安全问题吗? - Tim Baas
没错。我已将最佳答案更改为上面的那个。 - Rails beginner

0

如果你只能访问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 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接