0

我的问题有点复杂,然后标题假设。

我有两个 Rails4 应用程序。两者都通过 mongoid 访问同一个 mongodb。两者都使用 devise 3.0.0 进行身份验证,都具有相同的用户模型,该模型已启用设计并使用相同的集合。

第一个应用程序仅在域中提供一个 api:

api.myapp.com

第二个应用程序从

myapp.com

此外,我提供了一个 JS 单页应用程序:

app.myapp.com

后者可以毫无问题地访问 API,并在设计上使用自制的令牌身份验证补丁,以便令牌可以作为 HTTP 标头传输。

两个 Rails 应用程序在以下方面具有相同的内容:

config/initializers/devise.rb
config/initializers/secret_token
config/initializers/session_store

后一个看起来像:

Web::Application.config.session_store :cookie_store, key: '_myapp_session', domain: :all

这是我现在在基于 Backbone 的单页应用程序中所做的事情:

  1. 我登录应用程序
  2. 应用从 API 获取 auth_token
  3. 应用程序存储令牌
  4. 单页应用程序使用令牌请求几个额外的资源
  5. 响应标头设置 cookie

由于设置了 cookie,我也希望在 myapp.com 下登录我的 Rails 网站。无赖!我不是。

因此,为了伪造 API 问题,我执行以下操作:

  1. 我在 Chrome 中启动一个 REST 客户端
  2. 我使用此客户端登录 API 并获取令牌
  3. 我使用客户端和令牌请求一项额外资源
  4. 响应头设置一个 cookie
  5. 现在我进入我的 Rails 网站,然后……瞧,我登录了

我对这种行为感到困惑。当请求资源并且用户登录时,API 似乎会提供正确的 cookie。否则,在使用 REST 客户端后,我将不会登录我的网站。

但是,如果我的单页应用程序与 REST 客户端完全相同,并且接收到设置 cookie 的响应标头,则我没有登录我的网站。

有人有提示吗?

问候菲利克斯

4

2 回答 2

1

您可以使用中央身份验证服务器CAS,然后在每个应用程序中,您可以使用omniauth gem 登录,就像您在两个应用程序中使用 facebook 或 twitter 登录一样。

这将消除您自己处理 cookie 和票证的麻烦。

您可以使用CASINO,因为它易于安装和使用,您可以将omniauthomniauth-cas一起使用

您可以像将任何omniauth gem 与设计集成一样集成它。

于 2014-08-18T19:05:36.420 回答
0

您可能需要通过添加不包含完全限定域名的域参数来在 cookie 上设置特定范围。

而不是 cookie 位于“api.myapp.com”或“www.myapp.com”下,它需要通过被引用为“myapp.com”来共享

例子 :

cookies[cookie_name] = {:value =>token, :domain => 'myapp.com'}

我希望这会有所帮助!

于 2013-08-23T01:07:11.597 回答