RoR + Devise:CSRF 令牌在每次请求时都会更改

RoR + Devise: CSRF token changes at every request

我正在使用 Devise 来处理 Web 应用程序中的身份验证,并且我将其设置为与 Ajax 一起使用,如 this blog post 中所述。它工作正常,我可以登录和退出。但是,有一个异常:每次请求都会重新生成 CSRF 令牌。无论用户是否登录都会发生这种情况,即使请求是 GET,尽管我一直在到处阅读令牌在会话期间不应更改。这迫使我添加一种机制来更新客户端上的令牌,因为它不会自动完成,因为我使用 Ajax。有人可以告诉我这是否已成为新的默认设置,或者如果不是,我可能做错了什么?

使用的版本:Rails 4.2.5,Ruby 2.2.4,Devise 3.5.3。

终于想通了

我使用上面博客post中提供的代码通过调用form_authenticity_token获取CSRF token。正如我最终发现的那样,Rails 4.2.1 引入了一个调用 masked_authenticity_token 的新实现,这就是我认为令牌正在重置的原因。事实上它不是,只是发送了一个随机屏蔽的版本。这在source history中很清楚。可以像这样在当前 Rails 版本中获得实际令牌:session[:_csrf_token]。这对于检查令牌在不应该更改时不会更改很有用,这正是我试图做的。

我希望这个答案对某人有用。我确实花了很多时间才找到它。