您好!我迫切需要一些帮助来弄清楚这个错误:
重现步骤:
当用户在“偏好设置”中点击他们的 Discord “连接”按钮时,
它会正确地将用户重定向到 Discord 的授权页面。
但是,在点击“授权”按钮后,用户会被重定向并看到我们论坛上的此消息:

并且此主题顶部的错误会显示在管理员日志中。
我觉得我已经阅读并尝试了所有方法来修复这个问题,但它仍然发生。我已确保 Discord 客户端 ID 和 Secret 站点设置正确。
我还确保 URI 语法正确(基于我看到的一些相关主题):
有什么建议吗?我愿意尝试任何方法,即使您不确定它是否会起作用 
我认为(?)我已经将其缩小到 nginx 和/或缓存问题了? discourse.conf 中是否应该定义我们可能遗漏的特定于身份验证或 CSRF 的内容?
@merefield、@david、@sam - 抱歉打扰你们,但我看到你们的名字出现在过去许多与 csrf 相关的讨论中。你们对此有什么建议吗?鉴于 Discord 身份验证是 Discourse 的一个集成部分,我不确定可能是什么原因导致了这个问题。
提前感谢你们提供的任何帮助 
我们是不是违反了这些其中之一?
我仍然找不到规律。有时它能正常工作并将我正确连接,但其他时候我会遇到 CSRF 页面。
目前,我最怀疑的是 verified_request? 中的最后一个条件检查。
有什么简单的方法可以检查 (valid_request_origin? && any_authenticity_token_valid?) 是否返回 true 吗?
抱歉,我没有提供任何可调试的信息,但我认为我(痛苦地)找到了(至少我认为是)问题所在。我仍然不确定如何修复,所以请继续阅读 
下面的图片显示了一个连续的实例,我成功地关联了我的账户,刷新/再次尝试,但未能成功地进入“csrf detected”页面。我当时在一个隐身窗口中,在成功连接和 csrf 失败之间,我什么都没做/改变。这是我发现的:
所以第一张图显示了 _forum_session cookie 在 1 和 2 请求头中匹配,这导致了成功的连接。
然而,在我重新加载页面并再次尝试(并失败连接)后,你可以看到我左侧的搜索只显示了 _forum_session cookie 在请求头中出现了一次,而这导致了失败。
tl;dr:我很确定问题源于 discord?reconnect 请求头中的 forum_session cookie,以及随后 callback? 请求头不匹配。是什么导致它们不同?
好的,我认为我们越来越接近了。
所以在这张下面的图片中,您可以看到一个更新的 POST 请求发生在 discord?reconnect POST 请求 之后。
果然,它正在设置 _forum_session cookie,这导致了如上所述的不匹配。
如果我检查一个成功的连接实例(如下),您可以看到更新仅发生在 discord?reconnect POST 请求 之前。
这会导致 _forum_session cookie 匹配,并成功连接帐户而没有 csrf 问题。
如何阻止该更新在用户开始连接过程后发生?
@FerrariFlunker 抱歉回复慢了,但还没来得及看,如果核心团队能看的话那就太好了。
如果这能让你好受点,我可以重现这个问题,我相信我遇到了同样的错误:
(discord) 身份验证失败!csrf_detected: OmniAuth::Strategies::OAuth2::CallbackError, csrf_detected | CSRF 检测到
没关系 @merefield,感谢您的回复!
您是在自己的环境中遇到此错误的吗?我认为无论如何,此错误都需要由核心团队进行查看。我花了 2 周多的时间调试此问题,但仍未找到答案:/
1 个赞
david
(David Taylor)
12
挖得很棒!这种竞态条件肯定会导致您遇到的问题。
不过,我们没有收到其他关于此问题的报告,所以听起来这一定是您网站/配置的特定问题。您在网站上安装了哪些插件?您能否打开“update”调用并查看发送了什么有效负载?
3 个赞
在查看了更新调用后,我认为你是对的。以下是一些已确认导致 csrf 失败的“更新”请求的截图。
我看到一个与 cdn 相关的模式
那个地方会有什么配置错误?如果你仍然需要我们插件列表,请告诉我,我只是想节省这个回复 +1 张图片 
1 个赞
我有一个令人兴奋的更新!几天前,我仔细查看了“更新”负载,并成功地将此:
与我们的一个插件关联起来!

禁用该插件、进行进一步测试并成功向社区发布相关功能后……我认为我可以自信地说我们找到了罪魁祸首。
所以这个插件原来是罪魁祸首:GitHub - discourse/discourse-chat: Chat inside Discourse
事后看来,这解释了为什么它会是罪魁祸首——该插件仍被标记为实验性,并不适用于生产环境。 
由于我花了 3 周多的时间诊断这个问题,并且需要重新开始我们社区的其他项目
,因此我将无法帮助修复 discourse-chat 插件。
如果有人最终推送了该插件的修复程序,我们(很可能
)会考虑在我们的网站上重新启用该插件,但目前我们需要稳定的关联账户连接功能。
再次感谢所有帮助诊断的人! 
2 个赞
david
(David Taylor)
17
感谢 @FerrariFlunker 提供的超详细调查!
我刚刚在 Discourse 核心中提交了一个 PR 来修复这个问题:
之所以在移除聊天插件后问题得到修复,是因为聊天插件大量使用了这个“PresenceChannel”API,因此问题更有可能发生。我认为聊天插件不需要进行任何更改。
4 个赞
这能解决Google登录的相同问题吗?我的一个实例上的用户,我们在那里测试了聊天插件,他们非常喜欢它,但它破坏了Google登录,出现了与Discord登录相同的错误。
5 个赞