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

时间:2015-12-27 09:01:55

标签: ajax ruby-on-rails-4 devise csrf-protection

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

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

1 个答案:

答案 0 :(得分:3)

我终于明白了。

我使用上面博文中提供的代码通过调用 form_authenticity_token 来获取CSRF令牌。正如我最终发现的那样,Rails 4.2.1引入了一个名为 masked_authenticity_token 的新实现,这就是我认为令牌被重置的原因。实际上它不是,只发送了一个随机屏蔽的版本。这在source history中很清楚。可以在当前的Rails版本中获取实际令牌,如下所示: session [:_ csrf_token] 。这可以用来检查令牌不应该改变,这是我试图做的。

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