我在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
发生这种情况的条件是:
这显然是个问题,因为在后续请求中,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上工作了将近一个星期。因此,非常感谢社区的任何见解或建议。
答案 0 :(得分:7)
只是一个猜测,但似乎你没有带来Rails为所有基于POST的请求生成的CSRF令牌:
http://guides.rubyonrails.org/security.html#cross-site-request-forgery-csrf