多个选项卡打开时无效的真实性令牌

jas*_*328 5 session ruby-on-rails csrf devise ruby-on-rails-4

我有一个Rails 4.2应用程序.几个月前,我们开始遇到无效的真实性令牌错误.我发现以下场景重现了错误:

1)用户打开浏览器并访问ourwebsite.com/log-in.

2)用户在同一浏览器中打开第二个选项卡并访问ourwebsite.com/enroll-in-course.

3)用户返回选项卡1并登录提交POST表单.

4)用户转到选项卡2并在注册课程页面上提交POST表单.

5)出现错误.


以下是有关我们应用的一般信息:

  • 我们正在使用Devise 3.4.1并且应用了零定制.

  • 我们的应用程序控制器运行protect_from_forgery with: :exception.

  • 我们使用Turbolinks 2.5.

  • 我们不会缓存任何一种形式.

  • 我们Turbolinks.pagesCached(0);在所有页面上运行Javascript.

  • 重申一下,上述场景中的两种形式都是POST表单.除上述情况外,它们的工作完全正常.

  • 据我所知,我们在处理用户会话或CSRF令牌时没有做任何更改.

我有一个理论认为,因为我们登录用户,会话中存储的csrf_token会发生变化.因此,当用户在第二个选项卡中提交表单时,表单中的令牌将与会话中的令牌不匹配,并引发InvalidAuthenticityToken.怎么了,怎么解决这个问题?更好的是,这是否可以解决?