2012-03-24 37 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