请求和撤销权限

每种类型的登录流程都有相应的权限请求方法,具体取决于您的开放平台和您选择用于集成 Facebook 登录的方法:

网页

移动应用

  • Android 登录可以使用多种不同的类来请求和管理权限。详情请参阅 Android 版登录教程
  • iOS 登录可以使用多种不同的方法来请求权限。详情请参阅 iOS 版登录教程
  • 启动 URI 关联时,Windows Phone 使用 scope 参数

请注意,除了在首次登录过程中,上方列出的许多 API 在应用后续使用期间也可用于请求其他权限。

优化权限请求

一般来说,应用请求的权限越多,用户使用 Facebook 登录应用的可能性就越小。事实上,我们的研究表明,应用请求的权限超过 4 个时,完成登录的数量会显著减少。

守则

在登录过程中和登录后请求权限时,请遵循以下守则:

  • 只请求应用所需的必要权限。

  • 只在需要权限时请求权限。例如,如果应用要显示用户所在位置附近的风景名胜,在显示该信息前请求 user_location 能使用户更好地理解请求该权限的原因。

  • 分别请求读取和发布权限。详情请参阅下文

  • 切勿提前请求您认为未来可能需要的权限。用户会对此产生怀疑,并可能拒绝使用您的应用。

  • 提前告知用户您请求权限的原因。说明您为何需要访问某些内容,这样做能提升用户分享权限的意愿。


发布权限

应用应将读取和发布权限的请求分开。规划好应用,在首次登录时仅请求最基本的读取权限,之后在用户实际需要时(例如,当用户想在应用中创建开放图谱动态时),再请求任何发布权限。这能提供最佳用户体验并改善转化率。

如果应用连续请求读取和发布权限,您可能会收到开发者提醒。如要停止收到这些提醒,请将这 2 种请求分开,或在遇到特殊情况时遵循以下守则。

在极少数情况下,应用会预先请求发布权限(例如,应用不执行其他操作,只是将用户的心情发布到 Facebook)。针对此类情况,在首次登录时应仅请求最基本的读取权限。用户登录后,向用户显示一个屏幕以说明应用为何需要发布权限,同时允许用户通过点击按钮来选择接受授予发布权限的请求。这将为用户提供更多背景信息,并提高转化率。

如果您是首次关联使用邮箱的帐户与用户的 Facebook 帐户,则可能需要连续请求读取和写入权限。如果用户想在 Facebook 时间线分享动态,通常需要采取该操作。当应用创建登录对话框时,用户会连续看到 2 个对话框:一个是将用户帐户关联到应用,另一个是请求发布权限。对于这种情况,请确保您请求的唯一读取权限是 public_profile。这样做可提供最佳用户体验,因为用户希望从应用发布,但通常不愿意提供其他读取权限。这样做也可提高转化率。

检查当前权限

Facebook 允许用户完全控制他们授予应用的权限。用户不仅可以在看到登录对话框时控制权限,还可以在登录流程中选择不授予某些权限,并且随时在 Facebook 隐私设置中撤销权限。应用在尝试执行需要权限的 API 调用前,应先检查权限的有效性。例如,在发送消息前,先检查用户是否仍授予 email 权限。

对于网页应用,我们提供图谱 API 端点来检索已授予权限的列表:

GET /{user-id}/permissions

必须使用用户访问口令或应用访问口令才能发出此调用。调用将返回 JSON 字符串,其中包含已授予应用的权限名称及其状态:

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

我们也在 iOSAndroid 版 SDK 中提供了相应方法,通过与平台兼容的方式展示用户已授予应用的权限。

处理缺失的权限

当应用请求权限时,用户可能会完全拒绝授予这些权限、只授予部分权限或之后更改权限。为提供良好的体验,应用应具备处理这些情况的能力。

首先,应用应能处理已请求但未获授予的所有权限:

  • 先检查授予的权限,再尝试使用需要这些权限的 API。
  • 检测在没有正确权限的情况下发出 API 请求时所返回的权限错误。错误示例如下:
{
  "error": {
    "message": "(#200) The user hasn't authorized the application
     to perform this action",
    "type": "OAuthException",
    "code": 200
  }
}

应用检测到用户已拒绝授予部分或全部权限后,可以让他们重新返回登录流程,并请求任何所需权限。但是,这样的体验并不理想,应尽量避免。如果用户主动选择不为应用授予特定权限,即使再次提示,他们也不可能改变主意。您可以改为使用下列方法:

  • 如果用户拒绝登录对话框,请预先清楚说明您请求每项权限的原因,然后允许他们点击或轻触,以返回权限请求对话框。请勿不加说明就立刻将他们重定向至权限请求对话框。

  • 如果用户拒绝向应用授予权限,登录对话框将不允许应用重新请求权限,除非您随请求发送 auth_type=rerequest

  • 对于用户授予部分权限而非所有权限的情况,仅在需要缺失的权限时,再提示用户授予权限。例如,如果您的应用会向用户的邮箱发送订单确认电子邮件,则仅在用户下单时请求获取 email 权限。

  • 除非您在登录对话框中请求的权限对于应用功能非常关键,而且如果未获得这些权限,功能就无法正常运作,否则请允许用户在不授予这些权限的情况下继续使用应用。

如果在用户拒绝授予权限后,应用不断将用户引导至权限对话框,您可能会收到开发者提醒。如要停止收到这些提醒,请遵循上述守则。

撤销权限

应用可允许用户撤销之前授予的权限。例如,应用可以提供一个设置页面,以便用户停止接收邮件消息,并同时支持用户撤销 email 权限。

您可以通过调用图谱 API 端点来撤销特定权限:

DELETE /{user-id}/permissions/{permission-name}

该请求必须使用当前应用的用户访问口令或应用访问口令发出。如果请求成功,您将收到 true 响应。


撤销登录

您也可以通过调用该图谱 API 端点,允许用户彻底取消对应用的授权或撤销登录:

DELETE /{user-id}/permissions

您必须使用当前应用的有效用户访问口令或应用访问口令发出该请求。如果请求成功,您的应用将收到 true 响应。如果调用成功,用户的所有用户访问口令都将失效,因此用户必须重新登录。由于您取消了应用授权,因此用户还需像首次登录时一样授予应用访问权限。

平台指南

AndroidiOS网页