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

Rails authenticity token (CSRF) provided but being refused

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

添加了一个
<%= csrf_meta_tags %> 

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

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

我知道我并没有提供很多线索,但什么会导致真实性令牌在一种情况下被接受而在另一种情况下被拒绝?更广泛地说,authenticity_token 是如何生成的——每次加载页面时都会生成一个新的?

Rails 将加密随机 CSRF 令牌分配给用户 session。

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

你特别需要注意的一件事是,如果你正在使用片段缓存(通过缓存视图块来加速渲染),你需要确保你的 <%= csrf_meta_tags %> 没有被缓存,因为陈旧的 csrf 元标记将导致与 session.

中存储的令牌不匹配

使用 ajax 发帖时,您需要使用 X-CSRF-Token header 转发 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
});