2009-10-30 44 views
4

我使用的是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會話刷新,並獲得新的無限會話密鑰(和密碼)的方式。

+0

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

+0

我一直在嘗試讓我自己致電Facebook的login_status.php網址,但不幸的是,只有當我通過facebook.com域中的cookie時纔有效。我相信這是行不通的,因爲出於安全原因,我無法得到這些數據......對吧?出於測試目的,我只是將cookie值複製/粘貼到我的代碼中以進行調用,並且在cookie值更改之前它會運行一段時間。當然,我無法以編程方式獲取數據。這些新信息是否會引發你認爲我應該嘗試的其他可能性? – 2009-11-13 01:43:34

+0

它看起來越來越像這是Facebook API中用於處理會話狀態及其對cookie依賴的錯誤。查看Facebook bug 6421.我正在使用新的Facebook alpha JavaScript客戶端庫尋求解決方案,該客戶端庫支持無Cookie會話狀態管理。如果/當我解決它...我會保持這個問題更新。 – 2009-11-19 18:18:49

回答

5

討厭回答我自己的問題,但它肯定沒有解決方案。希望這可以幫助別人。

問題的根本原因是,Cookie不被新的會話及時,或直到頁面重新加載更新。 Facebook開發人員稱這是一個瀏覽器問題。包括.NET Facebook開發人員工具包在內的所有Facebook客戶端庫都依賴cookie來獲取會話信息。所以這是一個瀏覽器錯誤,或者一個Facebook錯誤,或者一個Facebook設計缺陷,以至於過分依賴cookies。查看Facebook bug 6421。

幸運的是,Facebook在alpha中有一個新的Javascript客戶端庫,它有一個無cookie的選項。

<div id="fb-root"></div> 
<script type="text/javascript" 
    src="http://static.ak.fbcdn.net/connect/en_US/core.js"> 
</script> 

<script type="text/javascript" > 

    // initialize the library with the API key, set cookie: false 
    FB.init({ 
     apiKey: your_facebook_apikey, 
     cookie: false, 
    }); 

    FB.getLoginStatus(function(response) { 
     if (response.session) { 
      alert(response.session.session_key); 
     } else { 
      // re-prompt for permissions or do some other exception handling 
     } 
    }, true); // critical optional parameter to force a refresh 

</script> 

(省略Facebook的權限提示和其他的東西爲簡潔起見)

在我的MVC應用程序,我提示的Javascript權限。在提交表單之前,我執行getLoginStatus調用並將sessionkey和secret置於表單字段中,以便將其發佈到控制器。

新的JavaScript客戶端庫是在http://github.com/facebook/connect-js

相關問題