我正在从我的rails站点向自身发送AJAX请求(从javascript到控制器)。Rails 拒绝允许 POST,除非我提供真实性令牌,所以我使用
<%= csrf_meta_tags %>
和
var AUTH_TOKEN = "<%=j form_authenticity_token %>"
一切都很好。但是,一位新客户最近安装了访问我的网站并首先触发 AJAX 的插件。但是对于这个客户 - 尽管提供了真实性令牌,但还是被拒绝了(我检查了日志。
我意识到我没有提供很多线索,但是什么可能导致真实性令牌在一种情况下被接受而在另一种情况下被拒绝?更广泛地说,无论如何如何生成authenticity_token - 每次加载页面时都会生成一个新页面?
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
});