【问题标题】:Rails, Devise, and multiple domainsRails、Devise 和多个域
【发布时间】:2013-01-11 07:47:00
【问题描述】:

假设我有一个应用程序要从完全不同的域访问,这些域都指向同一个服务器*:

example.com、example.net、foobar.com、...

我有一个基于 Devise 的身份验证系统,之前运行良好。但是,现在的目标是将 HTTPS 添加到登录系统。问题是,事实证明,没有办法在同一个 IP 地址上托管多个 HTTPS 网站**。为了解决这个问题,我将登录页面设置为始终 POST 到https://secure.example.com。据我所知,这工作正常。设计似乎对此毫无疑虑。但是,棘手的部分是用户现在需要重定向到 foobar.com,这也需要了解用户已登录。我在登录表单中的隐藏参数中传递了要返回的站点,并且重定向工作正常。我仍然无法通知 foobar.com 用户现在已登录。

我已经设法设置它,以便在返回到 foobar.com 时,它将用户的 secure.example.com 会话 cookie 复制到 foobar.com 的新 cookie 中。这部分工作正常。然而,在 Rails 控制台中,对 secure.example.com 和 foobar.com 的 Web 请求——每个请求都发送相同的 cookie——产生两个完全不同的会话,因此,难怪 Devise 的行为就像用户从未登录过foob​​ar.com

有谁知道为什么这不起作用 - 为什么两个相同的 Web 请求(只是请求 URI 的域不同 - 我也在 Firebug 中尝试过)会在 Rails 3 应用程序中产生两个完全不同的会话,但一致的会话ID?更重要的是,有人知道如何进行这项工作吗?

* 出于本练习的目的,假设这是不可避免的,并且站点不能全部托管在不同的子域下,并且所需的域数量太多而无法为每个域获取单独的 IP 地址。

** 除非它们是子域并且您拥有 *.example.com 证书,但这不是重点。

【问题讨论】:

标签: ruby-on-rails ruby https devise cross-domain


【解决方案1】:

如果您已经在使用 Devise,我建议您尝试使用 token authenticatable。您可以为相关用户生成令牌,使用令牌重定向他们进行登录,然后在他们登录后快速使令牌过期。

您也可以尝试使用 doorkeeper 滚动您自己的 OAuth 提供程序。

【讨论】:

  • token authenticateable 完美运行,这是一个相当干净的小解决方案!谢谢!
  • 如果有人决定在这里跟随我的脚步,让我指出你可能会遇到问题,除非你 prepend_before_filter 一些东西来注销当前用户(如果你的会话控制器中存在一个用户)。否则,Devise 喜欢认为它比你聪明。
  • @JakeHeimark 和 charredUtensil 我有一个问题。假设用户已经登录到 domain1.com,当他访问 domain2.com 时,系统如何知道该用户已经登录?如何使用 devise 在多个域之间共享会话?
  • @Chamnap 您不共享会话。您通过传递令牌来“伪造”它。它类似于您有时在登录网站的电子邮件(如密码重置)中获得的令牌。
  • @Chamnap 以令牌作为参数重定向:example.com/?token_id=<TOKEN>(检查令牌可验证文档以获取参数名称/格式)
猜你喜欢
  • 2012-06-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-22
  • 1970-01-01
  • 2014-02-10
相关资源
最近更新 更多