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

Fra*_*ter 6 air cookies ruby-on-rails http-headers ruby-on-rails-3

我在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
Run Code Online (Sandbox Code Playgroud)

并且Rails找到会话,确定用户是谁,并做其事.

但在某些情况下,Rails会在发送响应之前生成新会话.它向会话表添加会话,并使用新的会话ID 向客户端返回Set-Cookie标头.像这样:

_session_id=e1489a6b610c0a1d13cec1454228ae47; path=/; HttpOnly
Run Code Online (Sandbox Code Playgroud)

发生这种情况的情况是:

  • 请求来自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
Run Code Online (Sandbox Code Playgroud)

有没有对Rails在这种情况下会产生新会话的原因有任何见解?它似乎是我的控制器代码执行发生的,因为我在控制器中有正确的会话信息.

我正忙着尝试进一步隔离问题,控制AIR内的标题,等等.我已经在这个bug上工作了将近一个星期.因此,非常感谢社区的任何见解或建议.

Dan*_*ail 7

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

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