设备版“Facebook 登录”

如果您正在寻找 Facebook Portal 的相关帮助,请访问 Portal 帮助中心

若要输入设备版 Facebook 代码以登录您的智能电视、相机、打印机等设备,请访问设备版 Facebook 页面

实施设备版“Facebook 登录”后,可以支持用户使用其 Facebook 帐户登录您的应用或服务。通过该功能,用户可以在输入或显示功能有限的设备上登录,如智能电视、数码相框或物联网设备。

使用设备版登录时,您的设备将显示一个字母数字代码,并提示用户将其输入至台式机或智能手机上的网页中。使用您的应用或服务的用户之后可以授予权限。您的应用程序获得权限后,设备将收到访问口令,应用会使用这个访问口令请求图谱 API,从而确定用户身份并获得相关信息,以便为用户打造个性化的设备体验。

若您在构建 Apple TV、Android TV 或 Fire TV 的专用版电视应用,建议您使用 tvOS 版 Facebook SDKAndroid 版 Facebook SDK

本指南将介绍如何在不使用上述 SDK 的情况下手动集成设备登录。

用户体验

以下指南说明如何为各种设备和服务设计明确、安全和一致的登录体验。

1.行动号召

首先考虑在用户体验中,您希望在哪里邀请用户登录或通过 Facebook 连接。某些设备需要用户立即登录,而其他设备会在后续体验中才要求用户登录。

为确保用户体验拥有最佳可用性、一致性和可靠性,请尽量按照 Facebook 官方登录按钮设计按钮的外观。

从视觉设计的角度来说,这表示您应该

  1. 在按钮上加入“使用 Facebook 登录”或“连接 Facebook”的标签。
  2. 使用白色和 Facebook 品牌官方蓝色:#1877F2。
  3. 如果您的设备支持图形显示,您也可以使用官方“f”徽标。根据 Facebook 品牌指南,徽标应始终为白色或 Facebook 蓝色 (#1877F2)。

如果需要,请说明登录的好处。例如,“看看您的好友在看什么”或“查看 Facebook 相册中的照片”。

2.显示代码

当用户点击行动号召时,您的设备会调用 Facebook 的 API,这会返回一个代码。

在应用界面中展示以下消息,告诉用户他们需要访问一个网站并输入代码:“下一步,在电脑或智能手机上访问 facebook.com/device (http://facebook.com/device) 并输入此代码”。显示您从 Facebook 的设备登录 API 收到的完整代码。代码长度介于 6 到 12 个字符之间。

您可以添加 CloseCancel 按钮,以便用户取消设备登录流程。此按钮应将用户引导回最初的登录屏幕。

当代码显示在屏幕上时,您的设备应轮询设备登录 API,查看用户是否已向应用授权。几分钟后,如果用户未输入代码,设备登录 API 将返回 code_expired 错误。当设备收到该错误时,您应取消登录流程,然后界面应会显示行动号召。

也可利用网址中的内置用户代码生成二维码。通过将 user_code 参数添加至如下网址,即可完成此过程:

https://www.facebook.com/device?user_code=<USER_CODE>

3.授权

这是用户在电脑或移动浏览器上前往 facebook.com/device 时看到的流程。首先,用户会看到可以输入代码的文本字段:

输入代码并点击 Continue 后,用户可以选择要授予的权限:

如此,用户便知道登录流程成功,之后他们将看到一条确认消息:

4.确认成功登录

您的设备界面上也应显示一条确认消息。理想情况下,消息中应包括用户的姓名和 Facebook 头像(如有可能)。

在用户点击 Continue 按钮前,设备界面应始终显示这条确认消息。某些用户可能需要在其他位置将代码输入电脑,因此他们可能需要时间返回设备,看到确认消息后才能继续操作。

用户点击 Continue 后,设备将呈现卓越的个性化体验。

5.退出或断开连接

用户应可以从您的设备退出,且设备不应存储他们与 Facebook 的关联。为此,请在设备的菜单中加入 Log out from FacebookDisconnect from Facebook 选项。

当用户选择该选项时,您的设备应从内存中删除存储的访问口令。如果您将访问口令存储在数据库或云存储中,还应从这些地方删除。您无需调用 API,也可使访问口令失效。

用户退出后,您的设备应显示第 1 步中的初始行动号召。

实施设备版登录

设备版 Facebook 登录适用于直接从互联网调用 HTTP 的设备。以下是您的设备可以执行的 API 调用和响应。

1.启用设备版登录

加载应用面板,将“产品”>“Facebook 登录”>“设置”>“从设备登录”更改为“是”。

2.生成代码

当用户点击 Connect to FacebookLog in with Facebook 行动号召时,设备应发出如下 HTTP POST 请求:

POST https://graph.facebook.com/v2.6/device/login
       access_token=<YOUR_APP_ID|CLIENT_TOKEN>
       scope=<COMMA_SEPARATED_PERMISSION_NAMES> // e.g. public_profile,user_likes
       redirect_uri=<VALID_OAUTH_REDIRECT_URL>

scope 为可选参数,其中必须包含登录权限的逗号分隔列表,该列表已获准用于登录审核流程。

可在“应用设置”->“高级”中找到 CLIENT_TOKEN,该口令应结合您的应用编号(以竖线 | 分隔),以形成完整的 access_token

redirect_uri 是可选参数。当您提供网址时,用户将在成功登录后被重定向至该网址。这样您就可以让用户登录应用的网站,从而进一步管理帐户。该网址必须是在“应用设置 -> 高级”中配置的有效 OAuth 重定向网址。响应的形式为:

{
  "code": "92a2b2e351f2b0b3503b2de251132f47",
  "user_code": "A1NWZ9",
  "verification_uri": "https://www.facebook.com/device",
  "expires_in": 420,
  "interval": 5
}

该响应表示:

  1. 在设备上显示字符串“A1NWZ9
  2. 告诉用户前往“facebook.com/device”并输入该代码
  3. 代码将在 420 秒后过期。如果您在该时间后没有收到访问口令,应取消登录流程
  4. 设备应每 5 秒轮询一次设备登录 API,查看授权是否已成功。

3.显示代码

您的设备应显示 user_code,要求用户在电脑或智能手机上访问 verification_uri,例如 facebook.com/device。请参阅用户体验

4.轮询授权

您的设备应轮询设备登录 API,查看用户是否已向应用成功授权。该操作应按第 1 步中调用响应的 interval 执行,即间隔为每 5 秒一次。您的设备应轮询:

POST https://graph.facebook.com/v2.6/device/login_status
       access_token=<YOUR_APP_ID|CLIENT_TOKEN>
       code=<LONG_CODE_FROM_STEP_1> // e.g. "92a2b2e351f2b0b3503b2de251132f47"

对此次 API 调用的响应取决于用户在授权流程中的位置。您会收到访问口令或者错误对象及要解析的特定子代码:

错误子代码 响应示例 含义

N/A

{"access_token": "ABCD...", "expires_in" : 5183996 }

用户已成功授权设备。设备现可使用 access_token 值来调用经授权的 API。

1349174

{"error":{"message":"This request requires the user to take a pending action","code":31,"error_subcode":1349174,"error_user_title":"Device Login Authorization Pending","error_user_msg":"User has not yet authorized your application. Continue polling."}}

用户尚未向您的应用程序授权。继续以在第 1 步的响应中指定的速率轮询。

1349172

{"error":{"message":"User request limit reached","code":17,"error_subcode":1349172,"error_user_title":"OAuth Device Excessive Polling","error_user_msg":"Your device is polling too frequently. Space your requests with a minium interval of 5 seconds."}}

设备轮询过于频繁。将轮询的频率降低为首次调用 API 中指定的时间间隔。

1349152

{"error":{"message":"The session has expired""code":463,"error_subcode":1349152, "error_user_title":"Activation Code Expired","error_user_msg":"The code you entered has expired. Please go back to your device for a new code and try again."}}

设备代码已过期。取消设备登录流程,并将用户引导回初始屏幕。

5.确认成功登录

您收到访问口令时,表示用户成功授权应用。您应将访问口令留存在设备上。

如此用户便知道登录流程成功,且您的设备应会显示用户的姓名和头像(如可用),直到他们点击 Continue。如要获取用户的姓名和头像,您的设备应执行以下标准图谱 API 调用:

GET https://graph.facebook.com/v2.3/me?
      fields=name,picture&amp;
      access_token=<USER_ACCESS_TOKEN>

您将获得如下形式的响应:

{
  "name": "John Doe", 
  "picture": {
    "data": {
      "is_silhouette": false, 
      "url": "https://fbcdn.akamaihd.net/hmac...ile.jpg"
    }
  }, 
  "id": "2023462875238472"
}

请始终展示用户的姓名和头像,直至用户在设备上点击 Continue

6.存储访问口令

您的设备应存留访问口令,以便发出其他的图谱 API 请求。

设备登录访问口令可能有最长 60 天的有效期,但也可能在多种情形下失效。例如,当用户更改 Facebook 密码时,他们的访问口令即失效。

如果口令无效,您的设备应从内存中删除口令。使用设备的用户需要再次从第 1 步开始执行设备登录流程,重新获得有效的新口令。

问题解决

能否通过 HTTP 提出设备流程请求?
OAuth 2 需要使用 TLS/HTTPS。

能否通过 GET 方法提出设备流程请求?
所有设备流程请求都应是 POST 请求。

如何刷新设备登录访问口令?
设备登录访问口令的有效期最长可能为 60 天。

如果口令无效,您的设备应从内存中删除口令。设备用户需要再次执行第 1 步中说明的设备登录流程,重新获取有效的新口令。

如要详细了解刷新口令,请参阅访问口令

我在提出 POST 请求时遇到了 Invalid API method 错误,问题出在哪里?
如果您在提出 POST 请求时遇到如下错误:

{"error":{"message":"Invalid API method","type":"OAuthException","code":3}}

您可能需要在应用中启用“从设备登录”。

加载应用面板,将“产品”>“Facebook 登录”>“设置”>“从设备登录”设为“是”。

我的设备登录访问口令无效。我该怎么办?
如果访问口令无效,您的设备应从内存中删除口令,并获取新口令。设备用户需要再次执行第 1 步中说明的设备登录流程,重新获取有效的新口令。