【发布时间】:2011-07-08 10:31:16
【问题描述】:
我在 Rails 3 中有一个 REST API,有时从 AIR 应用程序访问,有时从浏览器访问。
我认为这是一个 Rails 3 问题,但它可能是一个 Flex/AIR 问题。
Rails 应用程序使用omniauth 进行身份验证,使用cancan 进行授权,并使用active_record_store。我使用会话模型来存储用户的身份。
(我不使用 cookie 会话是有原因的,这与 AIR for Android、OAuth 和 StageWebView 有关。)
我正在使用 Charles 来监控 HTTP 流量。
大多数请求都可以正常工作。浏览器(或 AIR 客户端)使用 Cookie http 标头将会话 ID 发送到服务器,如下所示:
_session_id=950dee7eca6732aa62b5f91876f66d15
Rails 会找到会话,找出用户是谁,然后做它的事情。
但在某些情况下,Rails 在发送响应之前会生成一个新会话。它将会话添加到会话表中,并使用 new 会话 ID 向客户端返回 Set-Cookie 标头。像这样:
_session_id=e1489a6b610c0a1d13cec1454228ae47; path=/; HttpOnly
发生这种情况的情况是:
- 请求来自 AIR 客户端
- 请求是一个 POST
这显然是个问题,因为在后续请求中,Rails 找不到用户信息。它在没有该信息的情况下创建了一个新会话。
所以我正在查看 POST 请求的 HTTP 标头。这是查尔斯的副本/粘贴;我在标题名称后插入了冒号以使其可读。
Host: localhost.seti.hg94.com:3000
Content-Type: application/x-www-form-urlencoded
User-Agent: Mozilla/5.0 (Macintosh; U; Intel Mac OS X; en) AppleWebKit/531.9 (KHTML, like Gecko) AdobeAIR/2.6
Referer: app:/AndroidApplication.swf
X-Flash-Version: 10,2,152,22
Accept: */*
Accept-Language: en-us
Accept-Encoding: gzip, deflate
Cookie: _session_id=950dee7eca6732aa62b5f91876f66d15
Content-Length: 84
Connection: keep-alive
任何人是否对 Rails 为何会在这种情况下生成新会话有任何见解?它似乎发生在我的控制器代码执行之后,因为我在控制器中有正确的会话信息。
我正忙于进一步隔离问题,从 AIR 中控制标头,等等。我已经在这个错误上工作了将近一个星期。因此,我们将不胜感激来自社区的任何见解或建议。
【问题讨论】:
-
当我在 localhost 上运行我的 rails 应用程序时,我发现我的 chrome 22.x 做错了什么,这就是为什么 session_id 在每个请求上都不断变化的原因。我使用了 Firefox,然后它工作了,会话 id 不再随 Firefox 改变。
标签: ruby-on-rails ruby-on-rails-3 cookies air http-headers