2011-10-10 99 views
0

我有一些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)访问令牌签名无效。”当试图张贴到朋友的墙上。

+0

我不是很舒服,但可能您只使用可用于开发的账户的代码。用不同的“开发者”帐户试试你的代码,看看它是否有效 – ArtoAle

+0

这是一回事吗? “开发者”帐户和普通Facebook帐户有什么区别?这个应用程序是关联我的正常Facebook的帐户。 –

+0

我已经验证了我的测试帐户,并将其添加为此应用的管理员,并且传递仍然失败,并且出现相同的“无效访问令牌签名”异常。从我的其他“真实”帐户(我使用该帐户创建此应用)访问令牌仍然可以发布到任何朋友的墙上。 –

回答

1

看起来你正在使用Facebook的旧登录方法,他们最近刚关闭,所以你的旧访问令牌不再有效?而你的JavaScript没有生成正确的类型的令牌。请阅读FB.login文档的最新版本,以获取有关需要进行哪些更改的更多信息。具体来说,

  • 通的OAuth:真正到了FB.init呼叫
  • 支票response.authResponse代替response.session的现在。

此外,请检查您的应用程序是不是在“沙箱模式”。进入应用程序设置页面并点击“高级”。沙箱模式使得只有开发人员才能使用该应用程序。

+0

老FB的好处。登录 - 我在过去的三周里度假,完全错过了。奇怪的是,旧的方式仍然工作得很好,但我会迁移,看看是否有帮助。沙盒模式已禁用。 –

+0

你的意思是“你的javascript没有生成正确的令牌”?我在启用Oauth的authResponse对象中获得的令牌与我在禁用会话对象时获得的令牌相同。是否有另一种访问令牌? –

+0

我以为Facebook曾经说过,新方法产生了不同类型的访问令牌,旧的令牌不再被接受,但我从未测试过,所以我可能错了。 –

0

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

Woops。

相关问题