我使用的是3.0版本的Facebook開發工具包構建一個MVC的iframe的Facebook應用程序,並遇到一些麻煩後,立即得到了無限的會話密鑰授予權後它被授予。如何獲得Facebook的無限會話密鑰offline_access使用Facebook開發工具包
當用戶第一次點擊我的應用程序設置視圖來設置他們的首選項時,他們只是有來自Facebook的通常過期會話密鑰。沒問題。
根據他們選擇的偏好,我提醒他們使用Facebook JavaScript客戶端庫FB.Connect.showPermissionDialog方法offline_access擴展權限。再次沒有問題,他們授予許可。
此時會發出一個新的非到期(無限)會話密鑰。我需要將其保存到我的數據庫以供將來使用。問題是,我不知道如何在需要時立即得到它。包含會話信息的Facebook cookie在更新頁面後纔會更新。
有一個開放的bug在Facebook的bug跟蹤系統,在與此相關的錯誤ID 6421,但我期待使用Facebook的開發工具包3.0發行版的服務器端解決方案。我想要一種方式告訴FDT api出去Facebook並獲得新的會話。
我知道新會話是在Facebook端建立的。 http://www.facebook.com/extern/login_status.php上有一個GET消息,在用戶授予offline_access權限後立即顯示在Firebug網絡面板中,並且包含新的非過期會話密鑰的javascript響應。如果我繼續使用舊的會話密鑰,我會從Facebook返回無效的會話錯誤。
在我的控制,我有這樣的代碼:
[AcceptVerbs(HttpVerbs.Post)]
[FacebookAuthorization(IsFbml = false)]
public ActionResult Index(FormCollection collection)
{
var api = this.GetApi();
var userid = api.Session.UserId;
var key = api.Session.SessionKey;
}
這是越來越老SessionKey,而不是新的非到期之一。
如果我在GET上使用ExtendedPermissions =「offline_access」裝飾我的ActionResult,則不會出現此問題,強制用戶在看到該頁面之前授予offline_access,但我不喜歡該用戶體驗。我更喜歡僅在需要時提示使用JavaScript,而且當使用ExtendedPermissions =「offline_access」時,javascript權限lightbox比整個頁面寬度權限提示要好得多。
我還試圖攔截調用我xd_receiver(我已經做了一個視圖,以便我可以打在其控制器中的調試器斷點和檢查從Facebook傳入的請求)。在授予擴展權限期間它會被擊中,但它也會引用舊的過期會話信息。
因此,要回顧一下,我在尋找使用Facebook的開發工具包,以迫使來自Facebook會話刷新,並獲得新的無限會話密鑰(和密碼)的方式。
github上雖然我寧願使用FDT API的解決方案,我會嘗試的方法是在http://www.facebook.com執行GET /extern/login_status.php在我的控制器。過去我沒有這個工作,但我想我可能需要通過我看到GET發生在Firebug中時發送的所有cookie。 如果這不能平移,我正在考慮一種醜陋的蠻力方法,比如在得到offline_access權限後強制頁面刷新,直到我得到一個expires == 0的會話密鑰,但這將是最後一個溝做法。 – 2009-11-05 16:38:37
我一直在嘗試讓我自己致電Facebook的login_status.php網址,但不幸的是,只有當我通過facebook.com域中的cookie時纔有效。我相信這是行不通的,因爲出於安全原因,我無法得到這些數據......對吧?出於測試目的,我只是將cookie值複製/粘貼到我的代碼中以進行調用,並且在cookie值更改之前它會運行一段時間。當然,我無法以編程方式獲取數據。這些新信息是否會引發你認爲我應該嘗試的其他可能性? – 2009-11-13 01:43:34
它看起來越來越像這是Facebook API中用於處理會話狀態及其對cookie依賴的錯誤。查看Facebook bug 6421.我正在使用新的Facebook alpha JavaScript客戶端庫尋求解決方案,該客戶端庫支持無Cookie會話狀態管理。如果/當我解決它...我會保持這個問題更新。 – 2009-11-19 18:18:49