【问题标题】:How to handle CSRF tokens in across 2 rails instances?如何跨 2 个 rails 实例处理 CSRF 令牌?
【发布时间】:2020-01-06 21:09:43
【问题描述】:

对我的 2 个 Rails 实例发出的 Web 请求有时会产生以下错误(静默)

...
W, [2019-09-04T10:53:53.880137 #13871]  WARN -- : Can't verify CSRF token authenticity
I, [2019-09-04T10:53:53.880465 #13871]  INFO -- : Completed 422 Unprocessable Entity in 1ms (ActiveRecord: 0.0ms)
...

我相信这是因为 CSRF 令牌是从 1 个实例生成的,而上述请求是针对另一个实例的。

如何在不禁用 CSRF 令牌的情况下解决此问题?

当前设置是 2 个虚拟机(在不同的机器上)运行同一个 Rails 应用的副本,位于负载平衡器后面。我查看了日志,并且这种情况每天至少发生 10 次。

任何帮助将不胜感激

【问题讨论】:

  • 您使用什么负载均衡器?负载均衡器设置中应该有一个简单的选项,可以将请求转发到同一客户端的同一实例。
  • 我们使用 BinaryLane 进行托管。他们有一个load balancer solution

标签: ruby-on-rails csrf


【解决方案1】:

我从未使用过 BinaryLane,我尝试查看他们关于设置负载平衡器的文档,我可以在其中向您展示,但找不到。

这是我在 GCP 中使用的负载均衡器配置:

寻找Session affinity 选项或类似的东西(请参阅他们对每个选项的解释),我选择Generated cookie。希望这能让您了解问题所在。

【讨论】:

  • 谢谢。我会与 BinaryLane 联系,看看能否找到答案。
  • 我收到了 BinaryLane 的回复。他们说:“负载均衡器在会话粘性上有 60 秒的超时时间(来自一个 IP 地址的请求将在 60 秒的窗口内继续发送到同一台真实服务器)。在那之后,请求可能会在任何服务器上结束负载平衡池。”
  • 我们可以选择增加超时时间吗?
  • 我会问的。我有一种很好的感觉,答案是否定的。我感觉您认为问题出在负载均衡器上,还是有多个应用程序在运行?
  • 我曾经遇到过同样的问题,第二个请求被转发到不同的实例,因此 Rails 无法验证 CSRF 令牌。
猜你喜欢
  • 1970-01-01
  • 2016-09-28
  • 1970-01-01
  • 2021-02-19
  • 2018-07-17
  • 2017-04-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多