Facebook 从Graph API返回的用户对象间歇性地包含权限数据的空数组

Facebook 从Graph API返回的用户对象间歇性地包含权限数据的空数组,facebook,facebook-graph-api,permissions,facebook-oauth,Facebook,Facebook Graph Api,Permissions,Facebook Oauth,我遇到了这样一种情况:请求用户授予画布应用程序的权限列表时,间歇返回一个空数组 图形请求的外观如下所示: "permissions": { "data": [ { "installed": 1, "email": 1, "bookmarked": 1, "publish_actions": 1 } ] } "permissions": { "data": [ ] } https://graph

我遇到了这样一种情况:请求用户授予画布应用程序的权限列表时,间歇返回一个空数组

图形请求的外观如下所示:

"permissions": {
  "data": [
    {
        "installed": 1,
        "email": 1,
        "bookmarked": 1,
        "publish_actions": 1
     }
  ]
}
"permissions": {
  "data": [

  ]
}
https://graph.facebook.com/[uid]?访问令牌=[token]&字段=权限

通常,正常响应如下所示:

"permissions": {
  "data": [
    {
        "installed": 1,
        "email": 1,
        "bookmarked": 1,
        "publish_actions": 1
     }
  ]
}
"permissions": {
  "data": [

  ]
}
偶尔,虽然响应如下所示:

"permissions": {
  "data": [
    {
        "installed": 1,
        "email": 1,
        "bookmarked": 1,
        "publish_actions": 1
     }
  ]
}
"permissions": {
  "data": [

  ]
}
代码将这种情况等同于未授予任何权限的用户,并重新启动身份验证流。问题似乎是间歇性的,因为用户最终进入应用程序,如果我手动重试在日志中找到的一些失败请求,权限将按预期返回

查看用户API文档(http://developers.facebook.com/docs/reference/api/user/),似乎排除了未授予的权限。文档中不清楚在未授予任何权限时会发生什么情况。我们假设一个空映射,它将呈现如下响应:

"data": [
  {
  }
]
但是,即使响应是空数组,如果不接受至少一些权限,也不能访问代码中发出此请求的点

这给我留下了几个问题,我希望有相关知识的人能回答:

  • 是否存在用户授予应用程序的权限无法通过Graph API使用的情况
  • 是否存在用户可以授权画布应用程序而不授予任何权限的情况?(取消“身份验证”对话框会导致一个带有其他查询字符串参数的请求,处理方式不同)
  • 在任何情况下,用户都可以在不取消应用程序授权的情况下撤销最初授予的权限吗
  • 编辑:

    基于下面的讨论,我想澄清一下,我的应用程序需要电子邮件许可,这似乎是不可撤销的。该应用程序始终需要电子邮件权限,因此不应该存在没有该权限的较旧安装的情况

  • 不,据我所知不是
  • 这种情况称为基本权限,在登录期间,不会在scope参数中指定其他权限
  • 是,应用程序用户可以撤销某些权限。去(http://www.facebook.com/settings?tab=applications)然后单击其中一个应用(例如Groupon、Music或YouTube)上的编辑,您可以看到用户可以随时删除某些权限。因此,你的应用程序读取它仍然拥有的权限是很好的。它可能会为您节省一些对无法再获取的对象/操作的浪费图形调用

  • 我应该澄清一下,该应用程序需要电子邮件和发布操作权限。AFAIK电子邮件始终标记为“必需”,因此不可删除(新身份验证对话框也是如此)。所以我希望至少电子邮件会一直存在。为了进一步澄清,我将在通过签名请求提供有效的用户身份验证令牌后进行此图形调用,因此我希望用户只有在授权应用程序并授予所需权限后才能到达这一点。我的答案仍然相同。要获得电子邮件,您必须调用图表:
    /me?fields=email
    ,因为这是一种特殊情况,不会通过正常的/me调用返回。至少一个月前是这样的……但正如你所知,Facebook总是在改变我们的事情。如果这让人困惑,很抱歉,但当我提到“电子邮件”时,我指的是“电子邮件”:通常作为“权限”的一部分返回的权限条目。不是人们用“fields=email”请求的实际电子邮件地址。再说一遍,因为我有一个用户访问令牌,我希望该应用程序得到授权,因此希望权限始终包括至少“installed”:1和“email”:1。或者我完全不同意这种假设?(另外还有一种特殊情况,它似乎是间歇性的,尽管我想可能有一个我还没有看到的落水洞)我的答案仍然是一样的。你只获得用户授予你的权限,不多也不少。我很困惑——如果应用程序需要电子邮件权限,并且只有在用户授权应用程序(接受电子邮件权限)后才提供身份验证令牌,并且以后无法删除电子邮件权限,如何在没有电子邮件权限的情况下拥有身份验证令牌?