ruby-on-rails - ActionCable、Heroku 自定义域和 Cookie

标签 ruby-on-rails cookies heroku actioncable

这是场景。我在一个网站上使用 ActionCable(我们称之为 www.example.com)。它在开发中工作得很好,但是一旦我将其推送到 Heroku,我就会收到 WebSocket 连接的 302 错误。

问题似乎源于我的 Heroku 使用自定义域这一事实。因此,如果我将 WebSocket 指向 wss://example.com,它会给我一个 302,我假设是因为它被重定向到 example.herokuapp.com 网址?

因此,鉴于此问题,我被迫将 WebSocket 连接指向 wss://example.herokuapp.com。我现在遇到的问题是,因为它本质上是我指向的新域,所以来自 example.com 的 cookie 不会与 example.herokuapp.com 共享。这意味着 example.herokuapp.com 正在传递一个空白 cookie,该 cookie 实际上是在我用于身份验证的 example.com 上设置的。

我通过记录未签名的 cookie(只是为了测试而暂时未签名,不要担心安全性)并在 example.herokuapp.com 服务器上设置该 cookie 来验证这是问题所在。之后它工作得很好。

显然我不能让某人去这两个网站只是为了设置一个该死的 cookie...

我希望找到一种方法来解决最初的问题,并能够将 WebSocket 指向我的自定义域 wss://example.com 而不必担心 cookie签名问题。这可能吗?

如果没有,在 example.herokuapp.com 域上设置 Cookie 的最佳方式是什么?

附注是的,我看过有关 ActionCable 和 Heroku 的其他问题,但似乎没有一个涉及自定义域。这个讨论了 cookie 解决方法,但我觉得它不适用于这种情况,因为它们不是相同的子域:Deploying Ruby on Rails app to Heroku while using Action Cable (Puma port listening)

感谢你们花时间帮助我:)

[编辑] 这似乎与这里的问题非常相似,但我得到的是 302 而不是 503。 Heroku error 503, webSockets on multiple domains

最佳答案

因此,问题似乎源于这样一个事实:WebSocket 请求没有被视为 WebSocket 请求,而是正常的、未升级的请求。这就是被设计重定向的。

我发现没有任何 HTTP_UPGRADE header 的原因是 CloudFlare。他们没有在非企业帐户(5000 美元以上)上启用 WebSocket。我在其他 SlackOverflow 问题上读到,您可以要求 CloudFlare 在您的帐户上启用它,但在他们开始为所有帐户类型启用它们之前很可能不会发生。

在 CloudFlare 打开 WS 之前,唯一的其他选择似乎是找到一种在自定义域和 Heroku 域之间共享/设置 cookie 的方法。我还没有找到解决方案,等待 Heroku 来帮助我。如果我能为 CloudFlare + 自定义域 Heroku + Action Cable 用户提供解决方案,我会为 future 可能的 Google 员工更新此答案。

关于ruby-on-rails - ActionCable、Heroku 自定义域和 Cookie,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33782332/

相关文章:

python - 在 Heroku 上部署 Flask - 错误 R10

mysql - 使用 node-mysql 从 heroku Node 应用程序连接到 Amazon RDS 数据库

ruby-on-rails - 强参数 - 无法访问深层嵌套的属性

cookies - 如何在 Go 中检索 cookie?

javascript - Highchart 日期选择器

cookies - Chrome 80 中的 SameSite cookie 扩展更改将如何影响 Identity Server 4 用户?

asp.net - HttpContext.Request.Cookies和HttpContext.Response.Cookies之间的关系

node.js - Heroku 构建被拒绝 - NodeJS

ruby-on-rails - Rails - 如何使用 Spree Commerce Sandbox 获取示例数据

ruby-on-rails - update_attributes() 与 update_all () 和已删除对象