2011-01-21 42 views
2

我想創建一個安全的cookie和我的Facebook應用程序的祕密,只有我知道,根據Facebook signed_request。我已經實施了Ruby method that decodes the signed_request sent by FacebookFacebook的Canvas身份驗證與Sinatra:簽名餅乾(帶機架)

這是行得通的,但現在,由於runwithfriends不會,我想向客戶端發送一個使用相同簽名過程的cookie。

我正在翻閱rack source code,它看起來像它提供了此功能。

但是,我想知道如何在Sinatra做到這一點。它看起來像set_cookie是圍繞set_cookie_headers的包裝,似乎不接受祕密。所以,我認爲我必須用Rack做。我會嘗試並報告。

與此同時,Sinatra Book表示它提供基於會話的cookie。

那麼,有什麼區別呢設定一個cookie之間:

set_cookie("u", 123) 

或設置會話變量:

session["u"] = 123 

我發現自己挖通過西納特拉&機架源代碼。我有個主意。我認爲除了某些默認功能外,它們幾乎是一樣的。

回答

2

一個選項。

我會推薦使用服務器端「會話」解決方案爲這樣的Facebook應用程序。例如,https://github.com/jodosha/redis-store爲您提供了一個可以存儲序列化對象的Sinatra「緩存」對象。您可以爲redis鍵設置過期時間,以避免內存過多。我建議使用facebook uid作爲緩存的關鍵字,以便無論用戶使用何種計算機/瀏覽器,她的會話都將始終如一。另外,這樣您不必擔心在iframe中設置cookie,這在Safari和Chrome中不起作用。

過濾器之前:@session = cache.fetch("session-#{@uid}") { {} }

過濾器後:cache.set("session-#{@uid}", @session)