2012-03-24 39 views
2

这是一个有趣的问题,真的,所有你设计师在那里。在外部来源设计会话重置发布URL

我们使用OmniAuth设计了设置,但无论您是通过Facebook登录还是通过普通用户名登录,都会发生问题。会发生什么,我们在我们的网站上嵌入了Flash游戏。当您完成玩游戏,该游戏将你的分数提交给Rails的后端:

request = new URLRequest("http://mydomain.com:2012/games/1/leaderboards/13/submitLeaderboardStatistic"); 
request.method = URLRequestMethod.POST; 

var loader : URLLoader = new URLLoader(); 
loader.dataFormat = URLLoaderDataFormat.VARIABLES; 
var variables : URLVariables = new URLVariables(); 
variables.game_value = aScore; 
variables.game_id = 1; 
variables.unique_identifier = "com.onecoolgameaday.highscores"; 
variables.time_stamp = new Date(); 

request.data = variables; 

loader.addEventListener(Event.COMPLETE, on_complete); 
loader.addEventListener(IOErrorEvent.IO_ERROR, onIOError); 
loader.load(request); 

的URL发送到我们的网址。控制器(排行榜嵌套在Games下)获取submitLeaderboardStatistic方法中的URL信息。这种方法处理信息。在此方法中,我拨打current_user以获得当前用户,即提交实际分数的人。问题是,current_user返回nil。

显然,发生了什么,一旦游戏启动该URL POST请求,设计使会话(或某物)无效,所以我不能分辨谁提交了分数。

为什么当Flash游戏发送URL后,当前登录的用户被“踢开”?我如何解决这个问题,我可以说“用户XXX提交了这个分数”。

谢谢!

的Rails 3.2.2
红宝石:1.9.2
设计:1.5.3

回答

1

您提交的表单是否具有有效的CSRF标记?如果csrf标记无效或不存在,我认为Devise调用reset_session。

+0

这其实是一个原因(我刚才发现)。 POST请求没有/有一个有效的CSRF令牌,所以它重置会话。我最终将CSRF令牌传入闪存应用程序,并在发送请求时使用它。这是正确的答案。 – 2012-04-24 02:08:43

0

尽量完整的URL地址设置为 “/游戏/ 1 /排行榜/ 13/submitLeaderboardStatistic”。当你使用POST方法到不同的域时,可能的原因是cross-domail-policy,它应该从服务器接收。

+0

出于安全原因,我没有在Stack Overflow上发布完整的URL(因为你说的原因)。该URL的格式为“http://mydomain.com:2012/games/1/leaderboards/13/submitLeaderboardStatistic”。我已经更新了OP来反映这一点。感谢发布! – 2012-03-24 22:00:25