我有一些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)无效的访问令牌签名。”当试图张贴到朋友的墙上时。
答案 0 :(得分:1)
看起来您正在使用Facebook最近刚刚关闭的旧登录方法,因此旧的访问令牌不再有效了?而且你的javascript没有生成正确的令牌。阅读最新版本的FB.login文档,了解有关您需要进行哪些更改的更多信息。具体来说,
另外,请检查您的应用是否处于“沙盒模式”。转到应用设置页面,然后单击“高级”。沙盒模式使得只有开发人员才能使用该应用程序。
答案 1 :(得分:0)
数据库的持久性是默默地将访问令牌修改为75个字符,在我自己的用户的情况下,这已经足够了(小用户ID,因为它是一个旧帐户) - 但是五个字符太短了我的测试帐户,用户ID非常大。
Woops。