我们的生产服务器已经产生了无效的真实性 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>

到目前为止,这是我发现的。
  • 我们使用Turbolinks 2.5.3(一年多来没有更新)。
  • 在每种无效 token 错误的情况下,用户都将真实性 token 传递给服务器,但最终只是无效。
  • 我们当前在应用程序 Controller 中使用protect_from_forgery with: :exception
  • 几个月前,当我们将一堆新代码插入生产环境时,错误开始出现。这个新代码跨越了数百个文件,但到目前为止,我在代码中没有发现与该问题相关的任何内容。
  • 在任何类型的浏览器和设备上都可能发生该错误。
  • 增加的流量和出现的无效身份验证 token 之间没有关联。
  • 用户可以来自任何国家。
  • 这些不是遇到这些问题的机器人。我们甚至让一位同事经历了这个错误,尽管他们不记得自己为产生该错误所做的事情。
  • 用户遵循典型的行为(如果不是预期的行为)。他们正在按预期使用该应用。我浏览了他们的点击并记录了行为历史以得出结论。

  • 最终,我想弄清楚该如何解决。我的第一步是成功重现该错误,但我什至无法做到这一点。我的问题是:我该怎么做才能弄清楚是什么原因造成的?我没有其他选择了。谢谢!

    最佳答案

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

  • 确保您已退出应用程序
  • 在浏览器选项卡中打开登录页面
  • 让它坐满足够长的时间以使 session /csrf token 过期(可能是几个小时)
  • 打开登录页面的另一个选项卡,然后登录
  • 返回旧选项卡,然后尝试再次登录-发生InvalidAuthenticityToken异常。

  • 我认为发生这种情况是因为两个选项卡共享一个 session ,即打开新选项卡时创建的 session 。但是,旧选项卡在登录表单中仍然具有旧 session 中的csrf token 。当新的 session cookie和旧的csrf token 一起提交时,它们不匹配,因此会引发错误。

    除了更优雅地处理错误,使用户看不到令人困惑的错误页面外,我不确定如何真正解决此问题。

    顺便说一句,我正在使用devise,但我认为它不是特定于Devise的。

    关于ruby-on-rails - 调试随机无效的真实性 token 错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40388139/

    10-11 23:04
    查看更多