【问题标题】:Sharing Authentication/Data from Rails to Phoenix?从 Rails 到 Phoenix 共享身份验证/数据?
【发布时间】: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


    【解决方案1】:

    假设您至少运行 Rails 4.1 并使用 JSON 序列化(使用 >=4.1 创建的应用程序的默认设置),共享会话并不难。快速谷歌搜索找到PlugRailsCookieSessionStore,它完成了这个。

    有关在 Rails 和另一种语言之间共享会话所需的更多信息,Matt Aimonetti 有一个 excellent blog post 提供详细信息。

    最后,如果您希望完全使用 Ruby,这绝对是可行的。 Ryan Stout 在FAQ for Volt 中讨论了围绕持久连接的可扩展性,它为每个用户使用持久连接。他链接的文章也很好读。提及它是为了帮助您权衡用另一种语言构建单独的应用程序的权衡。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-09
      • 2011-11-23
      • 2011-04-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多