Rails 3正在从AIR更改POST上的会话ID

时间:2011-03-03 22:46:59

标签: ruby-on-rails ruby-on-rails-3 cookies air http-headers

我在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头。这是Charles的复制/粘贴;我在标题名称后插入冒号以使其可读。

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中控制标题,等等。我已经在这个bug上工作了将近一个星期。因此,非常感谢社区的任何见解或建议。

1 个答案:

答案 0 :(得分:7)

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

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