Facebook的访问令牌仅适用于创建Facebook应用程序用户
我有一些JavaScript代码登录Facebook的用户并保存访问令牌到数据库:Facebook的访问令牌仅适用于创建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)访问令牌签名无效。”当试图张贴到朋友的墙上。
看起来你正在使用Facebook的旧登录方法,他们最近刚关闭,所以你的旧访问令牌不再有效?而你的JavaScript没有生成正确的类型的令牌。请阅读FB.login文档的最新版本,以获取有关需要进行哪些更改的更多信息。具体来说,
- 通的OAuth:真正到了FB.init呼叫
- 支票response.authResponse代替response.session的现在。
此外,请检查您的应用程序是不是在“沙箱模式”。进入应用程序设置页面并点击“高级”。沙箱模式使得只有开发人员才能使用该应用程序。
老FB的好处。登录 - 我在过去的三周里度假,完全错过了。奇怪的是,旧的方式仍然工作得很好,但我会迁移,看看是否有帮助。沙盒模式已禁用。 –
你的意思是“你的javascript没有生成正确的令牌”?我在启用Oauth的authResponse对象中获得的令牌与我在禁用会话对象时获得的令牌相同。是否有另一种访问令牌? –
我以为Facebook曾经说过,新方法产生了不同类型的访问令牌,旧的令牌不再被接受,但我从未测试过,所以我可能错了。 –
数据库的持久性悄悄地将访问令牌修剪为75个字符,这对我自己的用户来说已经足够了(小用户ID,因为它是一个旧帐户) - 但在这种情况下五个字符太短我的测试帐户有一个非常大的用户ID。
Woops。
我不是很舒服,但可能您只使用可用于开发的账户的代码。用不同的“开发者”帐户试试你的代码,看看它是否有效 – ArtoAle
这是一回事吗? “开发者”帐户和普通Facebook帐户有什么区别?这个应用程序是关联我的正常Facebook的帐户。 –
我已经验证了我的测试帐户,并将其添加为此应用的管理员,并且传递仍然失败,并且出现相同的“无效访问令牌签名”异常。从我的其他“真实”帐户(我使用该帐户创建此应用)访问令牌仍然可以发布到任何朋友的墙上。 –