csrf_meta_tags和form_for在Heroku上生成无效的base64

我正在使用 ruby​​ 2.7.1 和 rails 6.0.3.4 并且每当我尝试调用csrf_meta_tagsform_for

2021-02-01T07:25:10.058892+00:00 app[web.1]: [9c50e00c-9868-45dc-89d8-1ec8f42d56ab] ActionView::Template::Error (invalid base64):
2021-02-01T07:25:10.058893+00:00 app[web.1]: [9c50e00c-9868-45dc-89d8-1ec8f42d56ab]     1: <h2>Log in</h2>
2021-02-01T07:25:10.058894+00:00 app[web.1]: [9c50e00c-9868-45dc-89d8-1ec8f42d56ab]     2:
2021-02-01T07:25:10.058895+00:00 app[web.1]: [9c50e00c-9868-45dc-89d8-1ec8f42d56ab]     3: <%= form_for(resource, as: resource_name, url: session_path(resource_name)) do |f| %>
2021-02-01T07:25:10.058895+00:00 app[web.1]: [9c50e00c-9868-45dc-89d8-1ec8f42d56ab]     4:   <div>
2021-02-01T07:25:10.058896+00:00 app[web.1]: [9c50e00c-9868-45dc-89d8-1ec8f42d56ab]     5:     <%= f.label :email %><br />
2021-02-01T07:25:10.058898+00:00 app[web.1]: [9c50e00c-9868-45dc-89d8-1ec8f42d56ab]     6:     <%= f.email_field :email, autofocus: true, autocomplete: "email" %>
2021-02-01T07:25:10.058899+00:00 app[web.1]: [9c50e00c-9868-45dc-89d8-1ec8f42d56ab]
2021-02-01T07:25:10.058899+00:00 app[web.1]: [9c50e00c-9868-45dc-89d8-1ec8f42d56ab] app/views/devise/sessions/new.html.erb:3

部署到 Heroku 时,我只在生产中遇到此错误。在开发中,真实性令牌的生成没有错误,但由于某种原因,在 Heroku 上产生了上述错误。知道这里会发生什么吗?

我试图缩小导致问题的线路的范围,并且我已经达到了form_authenticity_tokenmasked_authenticity_token但到目前为止我还无法追踪哪些线路是问题。

其他一些可能相关的版本:

Gemfile.lock
------------
webpacker (4.3.0)

yarn.lock
---------
@rails/webpacker@4.3.0

我试过简单地省略csrf_meta_tags但后来我仍然在表单上遇到错误,如上所示。我找不到对其他有相同问题的人的任何参考,因此非常感谢任何帮助。

回答

在我们的服务器上,这个问题是由 Rails 从 6.1 降级到 6.0.3 引起的。

首先,我们尝试将 rails 从 6.0.3 升级到 6.1,但错过了一些迁移成功所需的更改,不得不恢复到 6.0.3。然而,在我们的应用程序在 Rails 6.1 上运行期间,许多用户请求被处理并生成了新的 csrf 令牌。问题是,Rails 6.1 有不同的 csrf 令牌生成算法,当我们恢复到 Rails 6.0.3 时,无法验证由 Rails 6.1 生成的令牌。

为了缓解这个问题并避免向用户显示错误,我们装饰了 csrf 生成函数来捕获上述错误并重置会话,以便可以生成与 Rails 6.0.3 兼容的令牌。

def rescued_csrf_meta_tags
  csrf_meta_tags
rescue ArgumentError
  request.reset_session
  csrf_meta_tags
end

附加服务器信息:

  • Ubuntu 16.04
  • 红宝石 2.6.5

编辑:正如@cecomp64 在评论中所写,另一个解决方案是清除浏览器缓存。显然,如果您的应用有很多用户,这将不容易实现。


以上是csrf_meta_tags和form_for在Heroku上生成无效的base64的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>