从 Rails 分享 Authentication/Data 到 Phoenix?
Sharing Authentication/Data from Rails to Phoenix?
背景
我有一个相当典型的 Rails 应用程序,它使用 Devise 进行身份验证管理。在构建此应用程序时,我意识到实时聊天将是一项很棒的功能。当然,理想情况下,这将使用 Websockets,以减少服务器上的轮询负载(同时使其更容易实现,因为您不必管理轮询)。
我很快意识到 Ruby 不太适合同时打开大量并发连接。然而,Phoenix 是用 Elixir 编写的,所以我可以使用 Erlang VM,它非常适合长连接。如果所有聊天数据都与主应用程序数据库分开存储,这似乎也将大有裨益,这也应该会减少将来的负载。
问题
我希望能够使这种分离对用户完全不可见。他们访问 www.example.com/chat
,它从 chat.example.com
加载所有相关数据并启动 websockets,而不需要他们登录到单独的服务。我认为使用 <iframe>
可能是解决此问题的方法。
我的问题是在两个应用程序之间共享身份验证和数据。 Rails 应用程序需要能够在 Phoenix 应用程序上创建对话以响应某些事件。 Phoenix 应用程序需要知道哪个用户当前通过 Rails 的身份验证,以及有关用户的一般数据。
使用 Rails 应用程序作为 ID 提供者的 OAuth 流程起初看起来很合适,但我想不出 Phoenix 应用程序 自动 被授予访问权限。我对 Phoenix 应用程序中存在的用户记录也有一些担忧——它应该知道主应用程序上的所有用户,这样你就可以开始与用户聊天,即使他们从未打开过聊天。
执行此操作的最佳方法是什么?我的直觉告诉我,这将涉及 window.postMessage
和某种令牌系统,但我想问一下,在我不小心造成不安全的混乱之前,普遍接受的做法是什么。
共享会话并不太难,假设您 运行 至少 Rails 4.1 并使用 JSON 序列化(使用 >=4.1 创建的应用程序的默认设置)。快速 google 搜索找到 PlugRailsCookieSessionStore,这就完成了。
有关如何在 Rails 和另一种语言之间共享会话的更多信息,Matt Aimonetti 有一个 excellent blog post 包含详细信息。
最后,如果您想完全留在 Ruby,那绝对是可行的。 Ryan Stout 在 FAQ for Volt 中讨论了围绕持久连接的可扩展性,它为每个用户使用持久连接。他链接的文章也很值得一读。仅提及它是为了帮助您权衡使用另一种语言构建单独的应用程序的权衡。
背景
我有一个相当典型的 Rails 应用程序,它使用 Devise 进行身份验证管理。在构建此应用程序时,我意识到实时聊天将是一项很棒的功能。当然,理想情况下,这将使用 Websockets,以减少服务器上的轮询负载(同时使其更容易实现,因为您不必管理轮询)。
我很快意识到 Ruby 不太适合同时打开大量并发连接。然而,Phoenix 是用 Elixir 编写的,所以我可以使用 Erlang VM,它非常适合长连接。如果所有聊天数据都与主应用程序数据库分开存储,这似乎也将大有裨益,这也应该会减少将来的负载。
问题
我希望能够使这种分离对用户完全不可见。他们访问 www.example.com/chat
,它从 chat.example.com
加载所有相关数据并启动 websockets,而不需要他们登录到单独的服务。我认为使用 <iframe>
可能是解决此问题的方法。
我的问题是在两个应用程序之间共享身份验证和数据。 Rails 应用程序需要能够在 Phoenix 应用程序上创建对话以响应某些事件。 Phoenix 应用程序需要知道哪个用户当前通过 Rails 的身份验证,以及有关用户的一般数据。
使用 Rails 应用程序作为 ID 提供者的 OAuth 流程起初看起来很合适,但我想不出 Phoenix 应用程序 自动 被授予访问权限。我对 Phoenix 应用程序中存在的用户记录也有一些担忧——它应该知道主应用程序上的所有用户,这样你就可以开始与用户聊天,即使他们从未打开过聊天。
执行此操作的最佳方法是什么?我的直觉告诉我,这将涉及 window.postMessage
和某种令牌系统,但我想问一下,在我不小心造成不安全的混乱之前,普遍接受的做法是什么。
共享会话并不太难,假设您 运行 至少 Rails 4.1 并使用 JSON 序列化(使用 >=4.1 创建的应用程序的默认设置)。快速 google 搜索找到 PlugRailsCookieSessionStore,这就完成了。
有关如何在 Rails 和另一种语言之间共享会话的更多信息,Matt Aimonetti 有一个 excellent blog post 包含详细信息。
最后,如果您想完全留在 Ruby,那绝对是可行的。 Ryan Stout 在 FAQ for Volt 中讨论了围绕持久连接的可扩展性,它为每个用户使用持久连接。他链接的文章也很值得一读。仅提及它是为了帮助您权衡使用另一种语言构建单独的应用程序的权衡。