管理网页版“Facebook 登录”中的权限

启动“登录”对话框最重要的流程之一是选择应用想要访问的数据。上述示例均使用了 scope 参数,它就是您请求访问用户数据的方式。这些参数内容均叫作权限

如需深入了解权限,请参阅我们的权限指南。但在处理权限和“登录”对话框时,请注意以下几点:

  • 您在创建对话框后请求权限。生成的一系列权限与返回的访问口令相关联。
  • 其他开放平台可能有不同系列的权限。例如,在 iOS 中,您可以请求获取标记用户的地点,而在网页版应用中,相同的体验无需此权限。
  • 您可以在之后需要更多功能时添加权限。如果需要新权限,您只需在用户已授予的权限列表中添加新权限,然后重新启用“登录”对话框,即可请求新权限。
  • “登录”对话框允许用户拒绝向应用授予所请求的某些权限。您的应用应处理这种情况。如需详细了解这类情况,请参阅我们的权限对话框
  • 请求默认字段以外的信息和 email 权限的应用必须先通过 Facebook 的审核,才能公开发布。如需详细了解,请参阅登录审核文档和通用审核指南

添加权限

使用 Facebook 登录的最佳实践之一是,不要同时请求读取权限和发布权限。为此,您的应用可以在用户登录一段时间之后再请求更多权限。那时,您只需要启动包含所请求新权限的“登录”对话框即可。

例如,假设您的“登录”按钮包含以下权限:

<fb:login-button scope="public_profile" onlogin="checkLoginState();">
</fb:login-button>

如果检查 /me/permissions了解用户在接受后授予的权限,您会看见以下代码:

{"data":
  [
    {
      "permission":"public_profile",
      "status":"granted"
    }
  ]
}

如果之后想要添加 email 权限,您可以通过 FB.login() 函数重新启动“登录”对话框,如下所示:

FB.login(function(response) {
   console.log(response);
}, {scope: 'email'});

(必须通过按钮的事件处理程序调用此函数,否则对话框可能被浏览器的弹出窗口拦截器阻止。)

注意,上述对话框只会请求新权限。收到新权限后,检查 /me/permissions 会生成以下结果:

{"data":
  [
    {
      "permission":"public_profile",
      "status":"granted"
    },
    {
      "permission":"email",
      "status":"granted"
    }
  ]
}

注意,新的 email 权限添加到了已允许的权限列表。

重新请求被拒绝的权限

“Facebook 登录”允许用户拒绝与应用分享某些权限。如果用户拒绝 user_likes(赞),则检查 /me/permissions 以了解授予哪些权限会生成以下结果:

{
  "data":
    [
      {
        "permission":"public_profile",
        "status":"granted"
      },
      {
        "permission":"user_likes",
        "status":"declined"
      }
    ]
}

注意,user_likes 的状态是被拒绝,而不是已授予。

您可以再一次请求用户向应用授予其曾拒绝的权限。您应该设置一个说明页面,告知用户应该授予相关权限的原因,然后重新请求。但如果您使用前面的章节中所述的方法,“登录”对话框不会请求此权限。

因为用户拒绝授予某权限后,“登录”对话框便不会重新请求该权限,除非您明确告知对话框要再次请求已拒绝的权限。

只需向 FB.login() 调用添加 auth_type: rerequest 标记即可作:

FB.login(
  function(response) {
    console.log(response);
  },
  {
    scope: 'user_likes',
    auth_type: 'rerequest'
  }
);

添加标记后,“登录”对话框就会重新请求被拒绝的权限。此对话框与“重新请求权限”章节所示的对话框非常相似,但此对话框让您可以重新请求被拒绝的权限。