2014-06-16 74 views
0

場景:我想通過JS登錄獲取fb頁面管理的用戶訪問令牌,並檢索令牌ONE TIME,並將其存儲在數據庫中。然後每天,我想做牆貼到那些頁面。發佈到FB頁面錯誤

我正在使用JS獲取初始令牌並將其存儲。然後使用c#FacebookSDK進行Web請求。

FB.login(function (response) { 

    var r = response; 

    // get access token of the user and update in database 
    $("#FacebookAccessToken").val(response.authResponse.accessToken); 

}, 
{ 
    scope: 'manage_pages,publish_stream' 
}); 

現在我保存這個令牌數據庫,我將使用這爲今後的圖形電話 - 這是正確的

在服務器端,當我需要做的前一天,一個帖子我檢索令牌,並做如下處理:

// step 1 get application access token 
var fb1 = new FacebookClient(); 
dynamic appTokenCLient = fb1.Get("oauth/access_token", new 
{ 
    client_id = appId, 
    client_secret = appSecret, 
    grant_type = "client_credentials", 
    scope = "manage_pages,publish_stream", 
    redirect_uri = siteUrl 
}); 

var fbTokenSettingVal = GetTokenFromDB(); // getting access token from database which was stored during JS fb login 

// step 2 extend token 
var fb2 = new FacebookClient(appTokenCLient.access_token); 
dynamic extendedToken = fb2.Get("oauth/access_token", new 
{ 
    client_id = appId, 
    client_secret = appSecret, 
    grant_type = "fb_exchange_token", 
    fb_exchange_token = fbTokenSettingVal.Val 
}); 

var userExtendedToken = extendedToken.access_token; // get extended token and update database 

// step 3 get page access token from the pages, that the user manages 
var fb3 = new FacebookClient { AppId = appId, AppSecret = appSecret, AccessToken = userExtendedToken }; 
var fbParams = new Dictionary<string, object>(); 
var publishedResponse = fb3.Get("/me/accounts", fbParams) as JsonObject; 
var data = JArray.Parse(publishedResponse["data"].ToString()); 

var pageToken = ""; 
foreach (var account in data) 
{ 
    if (account["name"].ToString().ToLower().Equals("PAGE_NAME")) 
    { 
     pageToken = account["access_token"].ToString(); 
     break; 
    } 
} 


// step 4 post a link to the page - throws error ! 
var fb4 = new FacebookClient(pageToken); 

fb4.Post("/PAGE_NAME/feed", 
    new 
    { 
     link = "http://www.stackoverflow.com" 
    }); 

最後4步拋出錯誤,張貼到選定的頁面時: 用戶未授權應用程序執行此操作

嘗試了幾種不同的方式,但徒勞無功。假設只有一個簡單的步驟,我在這裏做錯了。

此外,在提出請求之前,每次都可以爲用戶擴展fb訪問令牌嗎? 任何方式來檢查令牌是否過期?

+0

它是否適合您自己?我的意思是,如果您(應用程序開發人員)經歷了整個登錄過程並嘗試通過應用程序發佈其中一個粉絲頁面,它是否有效?如果不是,則認證流程有問題。順便說一下,我看到這個publish_stream很多。不過,我可以使用'publish_actions'正常工作。不知道是否是這樣。 – tattvamasi

+0

問題跟蹤器的頂部是這個問題嗎? https://developers.facebook.com/bugs/754785807919193/ - 這適用於未發表的帖子 – Igy

+0

感謝您的回覆,得到了原因,看到我下面的回覆。 – Umair

回答

0

如果您希望將來使用該訪問令牌。您需要獲取offline_access標記以及需要存儲在數據庫中的那個標記。

此離線accesstoken將會在用戶更改密碼或從Facebook帳戶中刪除您的應用程序時到期。

private void GetPermenentAccessTokenOfUser(string accessToken) 
    { 
     var client2 = new FacebookClient(accessToken); 

     //get permenent access token 
     dynamic result = client2.Post("oauth/access_token", new 
     { 
      client_id = _apiKey, 
      client_secret = _apiSecret, 
      grant_type = "fb_exchange_token", 
      fb_exchange_token = accessToken 
     }); 
     _accessToken = result.access_token; 
    } 
+0

對不起,offline_access已棄用;來源:https://developers.facebook.com/docs/roadmap/completed-changes/offline-access-removal/ – Umair

0

看起來像新的應用程序,我們需要從我們的應用程序申請manage_pages權限:

enter image description here

,我現在所做的。因爲它顯示了錯誤做登錄時:

enter image description here

此外,應用程序必須是活的,這樣他們就可以複製此權限,並驗證我們確實需要這個權限張貼到網頁。它有利於fb用戶的安全,但對開發者來說是一個耗時的過程。

任何方式,這可以跳過測試目的?