我的问题有点复杂,然后标题假设。
我有两个 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 的单页应用程序中所做的事情:
- 我登录应用程序
- 应用从 API 获取 auth_token
- 应用程序存储令牌
- 单页应用程序使用令牌请求几个额外的资源
- 响应标头设置 cookie
由于设置了 cookie,我也希望在 myapp.com 下登录我的 Rails 网站。无赖!我不是。
因此,为了伪造 API 问题,我执行以下操作:
- 我在 Chrome 中启动一个 REST 客户端
- 我使用此客户端登录 API 并获取令牌
- 我使用客户端和令牌请求一项额外资源
- 响应头设置一个 cookie
- 现在我进入我的 Rails 网站,然后……瞧,我登录了
我对这种行为感到困惑。当请求资源并且用户登录时,API 似乎会提供正确的 cookie。否则,在使用 REST 客户端后,我将不会登录我的网站。
但是,如果我的单页应用程序与 REST 客户端完全相同,并且接收到设置 cookie 的响应标头,则我没有登录我的网站。
有人有提示吗?
问候菲利克斯