2010-07-26 87 views
1

我已將我的網站與Facebook Connect,授權/單點登錄集成在一起,效果很好。ASP.NET和Facebook連接 - 如何使用Graph API發佈到用戶的牆上?

現在我試圖發佈一些東西到用戶的牆上,即時通訊有一些問題。

首先,即時通訊使用「舊」JavaScript API(FeatureLoader.js)。

這些都是使用圖形API URL的IM:

private const string UserDetails_Url = @"https://graph.facebook.com/{0}?access_token={1}"; 
private const string Feed_Url = @"https://graph.facebook.com/{0}/feed?access_token={1}"; 
private const string TokenExchange_Url = @"https://graph.facebook.com/oauth/access_token?{0}"; 

我使用TokenExchange_Url URL獲得唯一的用戶OAuth憑證,以與電話。

這是工作正常,因爲a)我收到令牌回來,和b)我可以發出HTTP獲取請求的圖形API(即UserDetails_Url),它工作正常。

但是,我不能使用發佈到用戶的牆上。

我敢肯定,問題是我沒有得到適當的用戶權限發佈到牆上(即facebook側設置)。

現在,我意識到我可以使用fbPublish API方法客戶端來做到這一點,但我想用Graph API做服務器端。因爲它非常直截了當(HttpWebRequest,set方法設置爲「POST」,設置內容類型/長度,將字節寫入Stream, 。等)

我認爲這個問題是我需要的用戶授予我aplpication「publish_stream」擴展權限

Facebook的圖形API doco說,要做到這一點在你的授權請求:

https://graph.facebook.com/oauth/authorize? 
    client_id=...& 
    redirect_uri=http://www.example.com/callback& 
    scope=user_photos,user_videos,publish_stream 

因爲使用下列URL IM得到OAuth令牌其迷惑:我使用了錯誤的令牌交換的URL

https://graph.facebook.com/oauth/access_token?bunchofqsparams 

是誰?爲什麼有兩個不同的URL似乎獲得相同的信息?

是的 - 我已閱讀Facebook API doco(無數次),是的,我已閱讀過其他類似的SO問題,但它們都導致使用客戶端API發佈到牆上,我想要做到這一點服務器側。

對於實際的「臉譜連接」按鈕,我使用的標準FBML:

<fb:login-button length="long" size="medium" autologoutlink="false" background="light" onlogin="facebookLogin('/login')" class=" fb_login_not_logged_in FB_login_button FB_ElementReady"><a id="RES_ID_fb_login" class="fbconnect_login_button"><img id="RES_ID_fb_login_image" src="http://static.ak.fbcdn.net/rsrc.php/zB6N8/hash/4li2k73z.gif" alt="Connect"></a></fb:login-button> 

當我點擊這個(而不是登錄到Facebook的),它會彈出,用戶可以登錄窗口。但它沒有「請求擴展權限」對話框 - 不應該嗎?或者是我需要手動觸發的另一個彈出窗口?

所以總結起來,這裏是我的問題:

  • 如何授予權限擴展發佈到用戶的牆?
  • 獲取OAuth令牌的正確URL是什麼?
  • 是否有顯示如何使用服務器端Graph API調用發佈到用戶牆上的權威來源?

回答

4

正如我推測,我錯過了一個調用客戶端API來請求擴展權限。 (即publish_stream)。

我有一個簡單的JavaScript函數,它是作爲FBML登錄控件的「onlogin」屬性的一部分執行的。

此前,我只是做一個重定向(然後將在服務器端代碼中進行單點登錄)。

現在,IM這樣做:

function postLogin(targetUrl) { 
    FB.Facebook.apiClient.users_hasAppPermission('publish_stream', function(result) { 
     if (result == 0 || result == null) { 
      FB.Connect.showPermissionDialog('publish_stream', function() { redirectTo(targetUrl); }); 
     } else { 
      redirectTo(targetUrl); 
     } 
    }); 
} 

翻譯成英文:

// On "Facebook Connect" click (which passes in a redirect URL) 
// Check if user has 'publish-stream' permissions 
// If they do, just redirect. 
// If they dont, show a dialog requesting that permission, then redirect. 

現在服務器端的圖形API調用一切工作的罰款。

因此,要回答自己原來的三個問題:

  • 如何授予擴展權限發佈到用戶的牆?

答:利用客戶端JavaScript API函數「FB.Connect.showPermissionDialog」,以顯示彈出式和「FB.Facebook.apliClient.users_hasAppPermission」,以檢查他們是否有權限。

  • 什麼是獲取OAuth令牌的正確URL?

答:我仍然認爲它是 「?https://graph.facebook.com/oauth/access_token {0}」,但https://graph.facebook.com/oauth/authorize {0}?」也許能用於服務器端認證/授權過程。

  • 是否有顯示如何使用服務器端Graph API調用發佈到用戶牆上的權威來源?

答:如果有,我不會必須問這個問題 - 因此,在短期的答案是否定的。 =)

建議任何人開始Facebook連接工作,儘量避免「舊JavaScript API」。儘可能多地使用服務器端(Graph API),並且只使用客戶端JavaScript API進行初始握手(跨域接收器)。

相關問題