2012-03-25 46 views
3

我得到了类似的对这个问题一个问题:jQuery Ajax calls in Rails 3 getting 401 Unauthorized RequestRails的3色器件401未经授权的Ajax调用

我已经加入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 %>

回答

14

笔者发布,这是一个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

这是更好的解决方案 – 2013-03-06 15:02:59

+1

从安全角度来看,这个问题的接受答案是危险的。请改用这个答案! – 2013-04-03 18:02:53

1

它不是设计给出401授权错误,而是CSRF令牌。

只是禁用它为我的行动:

protect_from_forgery :except => :rate 
+0

这是否意味着你的要求的动作是不安全了?我不是专家,但这不是安全问题吗? – 2014-02-06 11:38:55

+0

这是正确的..我已经改变了上面的答案以获得最佳答案。 – 2014-02-06 15:40:50

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 
相关问题