【发布时间】:2016-03-12 20:06:45
【问题描述】:
背景
我有一个相当典型的 Rails 应用程序,它使用 Devise 进行身份验证管理。在构建这个应用程序时,我意识到实时聊天将是一个很棒的功能。理想情况下,当然,这将使用 Websockets,以减少服务器上的轮询负载(以及使其更易于实施,因为您不必管理轮询)。
我很快意识到 Ruby 并不适合同时打开大量并发连接。然而,Phoenix 是用 Elixir 编写的,所以我可以使用 Erlang VM,它非常擅长长连接。如果所有聊天数据都与主应用程序数据库分开存储,这似乎也非常有益,这也应该在未来减少负载。
问题
我希望能够使这种分离对用户完全不可见。他们访问www.example.com/chat,它会从chat.example.com 加载所有相关数据并启动websocket,而不需要他们登录到单独的服务。我认为使用<iframe> 可能是这样做的方法。
我的问题是在两个应用程序之间共享身份验证和数据。 Rails 应用程序需要能够在 Phoenix 应用程序上创建对话以响应某些事件。 Phoenix 应用程序需要知道当前通过 Rails 认证的用户,以及有关用户的一般数据。
一开始,使用 Rails 应用程序作为 ID 提供者的 OAuth 流程似乎很合适,但我想不出一种方法让 Phoenix 应用程序自动获得访问权限。我还担心 Phoenix 应用程序中存在的用户记录——它应该知道主应用程序上的所有用户,因此即使用户从未打开过聊天,您也可以开始与用户聊天。
这样做的最佳方法是什么?我的直觉说这将涉及window.postMessage 和某种令牌系统,但我想问一下,在我不小心造成不安全的混乱之前,普遍接受的做法是什么。
【问题讨论】:
标签: ruby-on-rails authentication devise phoenix-framework