1

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

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

我有一个基于设计的身份验证系统,之前运行良好。但是,现在的目标是将 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 证书,但这不是重点。

4

1 回答 1

2

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

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

于 2013-01-28T08:25:11.820 回答