设计会话重置外部源POSTing URL

时间:2012-03-24 21:14:16

标签: ruby-on-rails actionscript-3 flash authentication devise

这是一个有趣的问题,真的,对于你所有的人来说,你都会在那里掌握。

我们使用OmniAuth设置了Devise,但无论您是通过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);

网址会发送到我们的网址。 Controller(排行榜嵌套在Games下面)获取submitLeaderboardStatistic方法中的url信息。此方法处理信息。在此方法中,我调用current_user来获取当前用户,即提交实际分数的用户。问题是,current_user返回nil。

显然,正在发生的事情是,一旦游戏启动了URL POST请求,设计会使会话无效(或者其他什么),所以我无法分辨谁提交了分数。

为什么Flash Game发送URL后,当前登录的用户会被“踢掉”?我如何解决此问题,以便我可以说“用户XXX提交了此分数。”

谢谢!

Rails:3.2.2
Ruby:1.9.2
设计:1.5.3

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

尝试将完整的URL地址设置为" / games / 1 / leaderboards / 13 / submitLeaderboardStatistic"。当您使用POST方法到不同的域时,可能的原因是应该从服务器接收的跨domail策略。