【问题标题】:Rails 3 is changing session ID on POST from AIRRails 3 正在从 AIR 更改 POST 上的会话 ID
【发布时间】: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


【解决方案1】:

只是一个猜测,但您似乎没有看到 Rails 为所有基于 POST 的请求生成的 CSRF 令牌:

http://guides.rubyonrails.org/security.html#cross-site-request-forgery-csrf

【讨论】:

    猜你喜欢
    • 2013-04-03
    • 2011-10-22
    • 1970-01-01
    • 2011-06-17
    • 1970-01-01
    • 2016-05-07
    • 1970-01-01
    • 2014-01-03
    • 1970-01-01
    相关资源
    最近更新 更多