发布到FB页面错误

时间:2014-06-16 22:32:42

标签: c# facebook facebook-c#-sdk

场景:我希望通过JS登录获取fb页面管理员的用户访问令牌并检索令牌ONE TIME,并将其存储在数据库中。然后每天,我想在那些页面上发帖。

我使用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访问令牌吗? 有没有办法检查令牌是否已过期?

2 个答案:

答案 0 :(得分:0)

如果您希望将来使用该访问令牌。您需要使用offline_access令牌和您需要存储在数据库中的令牌。

一旦用户更改密码或从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;
    }

答案 1 :(得分:0)

对于我们需要从我们的应用程序申请manage_pages权限的新应用程序看起来如此:

enter image description here

我正在做的事情。因为它在登录时显示错误:

enter image description here

此外,应用程序需要处于活动状态,因此他们可以重现此权限并验证我们是否确实需要此权限才能发布到网页。它有利于fb用户的安全,但对开发人员来说是一个耗时的过程。

出于测试目的,可以跳过任何方式吗?