提供Rails真实性令牌(CSRF)但被拒绝

时间:2015-06-19 03:10:43

标签: ruby-on-rails ajax csrf

我从我的rails网站向自己发送一个AJAX请求(从javascript转到控制器)。除非我提供真实性令牌,否则Rails拒绝允许POST,所以我使用

添加了一个
<%= csrf_meta_tags %> 

var AUTH_TOKEN = "<%=j form_authenticity_token %>"

一切都很好。但是,一位新客户最近安装了访问我的网站并首先触发AJAX的插件。但是对于这一个客户 - 尽管提供了真实性令牌,但真实性令牌被拒绝了(我在日志中检查过。)

我意识到我没有提供很多线索,但是什么可能导致真实性令牌在一种情况下被接受而在另一种情况下被拒绝?更广泛地说,无论如何都会生成authenticity_token - 每次加载页面都会创建一个新的?

1 个答案:

答案 0 :(得分:2)

Rails为用户会话分配加密随机的CSRF令牌。

服务器将为authenticity_token参数提交的值与与用户会话关联的值进行比较。

您特别需要注意的一件事是,如果您正在使用片段缓存(通过缓存视图块来加速渲染),您需要确保您的<%= csrf_meta_tags %>不会被缓存,因为陈旧的csrf元标记将导致与会话中存储的令牌不匹配。

使用ajax发布时,需要使用X-CSRF-Token标头转发CSRF令牌。

var promise = $.ajax({ 
    url: '/example',
    type: 'POST',
    beforeSend: function(xhr) { 
        xhr.setRequestHeader('X-CSRF-Token', 
        $('meta[name="csrf-token"]').attr('content')) 
    },
    data: 'someData=' + someData
});