调试随机无效的真实性令牌错误

时间:2016-11-02 19:24:55

标签: ruby-on-rails forms ruby-on-rails-4 session-cookies authenticity-token

我们的生产服务器几个月来一直在生成无效的真实性令牌错误。在几乎所有发送(PUT | POST | DELETE)请求的表单上都会产生错误。有时会发生错误,有时他们不会。似乎没有押韵或理由为什么它们会发生。错误本身并不经常发生,但这对我们来说是一种担忧。下面是导致此错误的典型表单的示例。

<form class="button_to" method="post" action="/lesson_progress_trackers/333">  
  <input type="hidden" name="_method" value="patch">
  <input class="finish-lesson-button" type="submit" value="Done!">
  <input type="hidden" name="authenticity_token" value="Qd3FsJZY2UXR9vahuFmaY5rrqA+J5xzGpl4cGI2Vwerx8PZPQtDMugz6oqoe3iviC+/U5zTYPdeX3apwbap09E==">
  <input type="hidden" name="completed" value="true">
</form>

这是我迄今为止所发现的。

  1. 我们使用Turbolinks 2.5.3(我们在一年多时间内没有对此进行更新)。
  2. 在无效令牌错误的每种情况下,用户都将真实性令牌传递给服务器,它最终无效。
  3. 我们目前在应用程序控制器中使用protect_from_forgery with: :exception
  4. 几个月前,当我们将一堆新代码推向生产时,错误就开始出现了。这个新代码涵盖了数百个文件,但到目前为止,我还没有在代码中发现任何与此问题相关的内容。
  5. 任何类型的浏览器和设备都可能出现此错误。
  6. 增加的流量与出现的无效身份验证令牌之间没有相关性。
  7. 用户可以来自任何国家。
  8. 这些不是机器人遇到这些问题。我们甚至让一位同事遇到了这个错误,尽管他们无法回忆起他们为制作它所做的一切。
  9. 用户遵循典型的,如果不是预期的行为。他们按预期使用应用程序。我查看了他们的点击次数并记录了行为历史记录以得出结论。
  10. 最终我想弄清楚如何解决这个问题。我的第一步是成功重现错误,但我甚至无法做到这一点。我的问题是:我能做些什么来帮助我找出造成这种情况的原因?我的选项已经用完了。谢谢!

1 个答案:

答案 0 :(得分:2)

Dunno如果为时已晚,无法使用,但我遇到了同样的问题。我能够通过以下方式重现:

  1. 确保您已退出应用
  2. 打开登录页面的浏览器标签
  3. 让它足够长,以使session / csrf令牌失效(可能需要几个小时)
  4. 打开登录页面的另一个标签,然后登录
  5. 返回旧标签页并尝试重新登录 - 发生InvalidAuthenticityToken异常。
  6. 我认为这发生在我身上,因为这两个标签共享一个会话,即打开新标签时创建的会话。但是,旧选项卡仍然具有登录表单中旧会话的csrf令牌。当新会话cookie和旧csrf令牌一起提交时,它们不匹配,因此抛出错误。

    我不确定如何实际解决此问题,除了更优雅地处理错误,以便用户不会看到令人困惑的错误页面。

    顺便说一下,我正在使用设计,但我不认为它是专门设计的。