Facebook访问令牌仅对创建facebook应用程序的用户有效

时间:2011-10-10 21:31:23

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

我有一些JavaScript登录Facebook用户并将访问令牌保存到数据库:

window.fbAsyncInit = function () {
    FB.init({
        appId: '<%=FaceBookApplicationId() %>',
        status: false, // check login status
        cookie: true,
        oauth: true
    });
};

function facebookLogin() {
    FB.login(function(response) {
        if (response.authResponse) {
            __doPostBack('__Page', 'FacebookDeliveryButton: ' + JSON.stringify(response.authResponse));
        } else {
            console.log('User cancelled login or did not fully authorize.');
        }
    }, { scope: 'offline_access,read_stream,publish_stream,user_photos' });
}

点击按钮会触发facebookLogin(),登录facebook用户,获取包含访问令牌的facebook会话,我将JSON序列化并发布到服务器。然后,服务器将此访问令牌保存到数据库表FacebookDeliveryQueue。

我运行的Windows服务会定期查询FacebookDeliveryQueue表,并尝试使用我们之前保存的访问令牌在用户的墙上发布:

IQueryable<FacebookDeliveryQueue> toSend = objectContext.FacebookDeliveryQueues.Where(p => !p.IsDelivered);
foreach (FacebookDeliveryQueue facebookDeliveryQueueItem in toSend)
{
    string facebookAccessToken = facebookDeliveryQueueItem.Cart.FacebookAccessToken;
    string facebookRecipientId = facebookDeliveryQueueItem.Cart.FacebookRecipientId;

    var client = new FacebookClient(facebookAccessToken);
    dynamic parameters = new ExpandoObject();
    parameters.message = facebookDeliveryQueueItem.Cart.CustomMessageBody;    
    client.Post(facebookRecipientId + "/feed", parameters);
}

我的问题是,这只适用于创建facebook应用程序的用户访问令牌。例如。

成功: 我,这个应用程序的创建者,登录并选择我的一个朋友发送消息,此信息保存到数据库,服务运行,我的消息发布到我朋友的墙上。

失败: 我登录我的虚拟测试帐户(批准此帐户的应用程序权限),选择我的虚拟测试帐户的朋友,此信息保存到数据库,服务运行并抛出无效的访问令牌错误。

任何想法为什么?

更新:切换到Oauth登录 - 没有变化。仍然得到“(OAuthException)无效的访问令牌签名。”当试图张贴到朋友的墙上时。

2 个答案:

答案 0 :(得分:1)

看起来您正在使用Facebook最近刚刚关闭的旧登录方法,因此旧的访问令牌不再有效了?而且你的javascript没有生成正确的令牌。阅读最新版本的FB.login文档,了解有关您需要进行哪些更改的更多信息。具体来说,

  • 传递oauth:true到FB.init调用
  • 现在检查response.authResponse而不是response.session。

另外,请检查您的应用是否处于“沙盒模式”。转到应用设置页面,然后单击“高级”。沙盒模式使得只有开发人员才能使用该应用程序。

答案 1 :(得分:0)

数据库的持久性是默默地将访问令牌修改为75个字符,在我自己的用户的情况下,这已经足够了(小用户ID,因为它是一个旧帐户) - 但是五个字符太短了我的测试帐户,用户ID非常大。

Woops。