如何在Rails中处理具有过时CSRF真实性令牌的页面

Jac*_*cob 6 session ruby-on-rails csrf

在我们的Rails应用程序中,用户通常会一次打开多个浏览器选项卡数小时或数天.在其中一个选项卡中,用户注销然后重新登录(或会话过期并创建新会话)时会出现问题.

这会导致所有其他选项卡上的CSRF真实性令牌变为无效.如果他们试图提交任何形式或就这些选项卡的任何Ajax请求无需刷新,他们将得到一个错误(而事实上得到登出,因为这是当一个坏的真实性令牌传递默认Rails的行为).

这种行为显然是不可取的.我想知道人们如何优雅地处理用户有一个窗口打开你的网站,但真实性令牌已过期的情况.

我不想做的只是将它们重定向到登录页面,因为这样他们可能会丢失他们的工作,例如他们已经写了很长的博客文章或其他东西.

想到的解决方案是使用一些javascript来轮询服务器以检查真实性令牌是否已更改,或者轮询用户的cookie以检查会话是否已更改.我从来没有听说有人做过这些,所以我想看看社区的想法.

jdo*_*doe 3

首先:登录/退出/登录不会导致出现新的 csrf 令牌。它仍然会保存在用户的 cookie 中。下次通过同一浏览器登录时,它将获得相同的令牌。

在最新版本的 Rails 中,如果令牌不正确,则不会引发任何错误:Rails 所做的一切都是——只是在将会话传递到控制器之前重置会话。

因此,更新你的 Rails,你会少一点痛苦。