所以我有使用 Devise 的 AJAX 登录/注销。如果我使用 AJAX 注销,会话将被重置并且我正坐在一个陈旧的 CSRF 令牌上。为了解决这个问题,我想我会在我的注销服务器端代码中生成一个新令牌,将它传递回客户端,然后让客户端将它设置在适当的位置。所以我像这样返回JSON:
return render :json => {:success => true,·
:user_registration_path => user_registration_path,
:csrfToken => form_authenticity_token}
然后我在我的 ajax 成功处理程序中处理,如下所示:
logoutAuth: function(e, data, status, xhr) {
console.log(data);
console.log(status);
console.log(data.csrfToken);
$('.calendar').hide();
$('.sign-out-button').hide();
$('.right').append($('<li class="btn log-in-button"><a class="standout" href="#" data-reveal-id="login">Member Log in</a></li>'));
$('.right').append($('<li class="btn sign-in-button"><a class="standout-primary" href="' + data.user_registration_path +·
'" data-reveal-id="sign-up">Member Sign up</a></li>'));
// reset CSRF token with new token generated after sign out -- to allow AJAX with CSRF protection
$('meta[name="csrf-token"]').attr('content', data.csrfToken);
}
这是奇怪的部分:当我在服务器上看到调用 form_authenticity_token 的结果时,我得到了一些随机生成的大哈希。预期的。当我 console.log(data.csrfToken) 时,该哈希应该映射到什么,我得到未定义。我的数据对象中的其他变量是可访问的。此外,我在开发人员工具的 XHR 响应中看到了令牌。这是怎么回事?此外,这是重置真实性令牌的首选方式吗?