2

所以我有使用 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 响应中看到了令牌。这是怎么回事?此外,这是重置真实性令牌的首选方式吗?

4

0 回答 0