登录 Facebook 游戏平台

The Web Games on Facebook and Facebook Gameroom platforms are no longer available for new submissions. This documentation is intended solely for developers with existing games. To learn more, read our blog post.

当您构建在 Facebook.com 上玩的游戏时,您实际是在构建可在 Facebook.com 上的 iframe 容器中提供服务的网页应用。Facebook 游戏仅面向已登录玩家开放,这表示您一定可以验证已登录 Facebook 用户的身份。

因此,您应该在游戏中增加对 Facebook 登录的支持,为自己提供一个固定编号,以便同步和保存游戏进度,并在玩家所玩的游戏中实现他们所需的社交功能。如果您的游戏会上线多个平台,则您可以使用同一个编号,以便在玩家使用的各个设备上同步游戏状态。

本文概述了使用 Facebook 登录的不同方法及其在游戏中的最佳利用方式。

身份验证来源

玩家可使用多种方式完成首次身份验证,也可使用多种方法在首次验证后确认身份。

应用中心身份验证

玩家通过“应用中心”的开始游戏按钮启动您的游戏时,就会向您的应用授予应用面板的“应用详情”选项卡内设置的一系列特定权限。

应用中心的“开始游戏”按钮

鉴于有相当一部分玩家通过应用中心进入您的应用,这也就成为一个常见的身份验证途径。为确保用户能从应用中心顺利登录,您应配置用户通过应用中心授予的一组权限,使其与游戏在 Facebook.com 和移动设备上的所需权限相对应。

详情请参阅应用中心指南

其他平台上的身份验证

如果您的游戏在移动端平台上线,且移动版支持 Facebook 登录,那么部分玩家在 Facebook.com 上玩游戏之前,有可能已经过身份验证。务必确保对于 Facebook.com 上的游戏版本而言,其所需的权限与移动设备上的游戏版本所需的权限相同。

检测登录状态

如上所述,玩家来到游戏界面时会处于已登录未登录状态,具体取决于他们之前通过应用中心在 Facebook 上玩游戏或在移动设备上玩游戏时,是否已为游戏完成身份验证。

您可通过以下两种方式来检测玩家之前是否已登录游戏:

  • 在客户端可使用 JS SDK FB.getLoginStatus() 方法
  • 在服务器端可通过解码 signed_request

使用 JavaScript 版 Facebook SDK

通过在文件加载时调用 FB.getLoginStatus(),可确保玩家在加载游戏时立即登录。然后,您可以使用 FB.api(),通过用户编号访问玩家的游戏状态,并检索可用于个性化的信息,如玩家的姓名、头像和好友名单。

FB.getLoginStatus(function(response) {
  if (response.status === 'connected') {
    // the user is logged in and has authenticated your
    // app, and response.authResponse supplies
    // the user's ID, a valid access token, a signed
    // request, and the time the access token 
    // and signed request each expire
    var uid = response.authResponse.userID;
    var accessToken = response.authResponse.accessToken;
  } else if (response.status === 'not_authorized') {
    // the user is logged in to Facebook, 
    // but has not authenticated your app
  } else {
    // the user isn't logged in to Facebook.
  }
 }); 

如果玩家尚未登录,您可以调用 FB.login(...),在游戏的初始界面上显示需要强制回应的登录对话框。此对话框的回调方法应与调用 FB.getLoginStatus 的方法相同

使用已签名请求

在 Facebook.com 上加载游戏后,系统将向您指定 Facebook 网站游戏网址发出 HTTP POST 请求。此 POST 请求将包含一些参数,其中包括用于身份验证的 signed_request 参数。

signed_request 使用 base64url 编码,并根据 OAuth 2.0 协议使用 HMAC 版本的应用密钥签名。

这表示,当应用收到 POST 请求时,您需先进行解析和验证,然后才能使用。整个过程分为三个步骤:

  1. 使用“.”字符将签名请求分为两个部分(例如 238fsdfsd.oijdoifjsidf899
  2. 解码经过 base64url 编码的第一部分,即经过编码的签名
  3. 解码经过 base64url 编码的第二部分,即负载,然后解码所得的 JSON 对象

任何现代编程语言均可执行这些步骤。以下使用 PHP 的示例:

function parse_signed_request($signed_request) {
  list($encoded_sig, $payload) = explode('.', $signed_request, 2); 

  $secret = "appsecret"; // Use your app secret here

  // decode the data
  $sig = base64_url_decode($encoded_sig);
  $data = json_decode(base64_url_decode($payload), true);

  // confirm the signature
  $expected_sig = hash_hmac('sha256', $payload, $secret, $raw = true);
  if ($sig !== $expected_sig) {
    error_log('Bad Signed JSON signature!');
    return null;
  }

  return $data;
}

function base64_url_decode($input) {
  return base64_decode(strtr($input, '-_', '+/'));
}

这将产生类似如下所示的 JSON 对象:

{
   "oauth_token": "{user-access-token}",
   "algorithm": "HMAC-SHA256",
   "expires": 1291840400,
   "issued_at": 1291836800,
   "user_id": "218471"
}

通过解析 signed_request 参数,您将能够检测当前玩家是否已针对您的游戏完成身份验证。如果是,signed_request 将包含该玩家的用户编号,该编号可用于检索个性化信息和游戏状态。您可以借此 signed_request 交换访问口令,然后通过该口令访问图谱 API,进行更深入地个性化。

首次身份验证

玩家首次来到您的游戏界面时,您应通过显示登录对话框来邀请玩家进行身份验证。对于客户端登录流程,建议使用 Javascript SDK 以便完成身份验证。开发者可以在启动登录对话框之前和取消对话框之后,显示简单的游戏图像。

在登录时使用定制背景的 Happy Acres

在客户端上使用 JS SDK 登录

Facebook 游戏的独特之处在于,JavaScript 版本的登录对话框将在 iframe 内以 async 模式触发。这意味着该对话框将以需要强制回应的弹出式通知形式出现在游戏内容上方,而不是显示为单独的弹出式浏览器窗口。

这点非常重要,因为这表示您可直接通过代码调用登录对话框,而且该对话框将不再作为用户界面事件的一部分,也就不会再被浏览器的弹出窗口阻止检测方法拦截。

如此一来,您便可以凭借 FB.getLoginStatus() 确认当前玩家是否已经在您游戏中完成身份验证;如果还未完成,您可以调用 FB.login(),从而在您游戏内容上方立即显示登录对话框,而无需显示“登录”按钮。

参见下方示例:

// Place following code after FB.init call.

function onLogin(response) {
  if (response.status == 'connected') {
    FB.api('/me?fields=first_name', function(data) {
      var welcomeBlock = document.getElementById('fb-welcome');
      welcomeBlock.innerHTML = 'Hello, ' + data.first_name + '!';
    });
  }
}

FB.getLoginStatus(function(response) {
  // Check login status on load, and if the user is
  // already logged in, go directly to the welcome message.
  if (response.status == 'connected') {
    onLogin(response);
  } else {
    // Otherwise, show Login dialog first.
    FB.login(function(response) {
      onLogin(response);
    }, {scope: 'email'});
  }
});

后续步骤

无论您选择使用哪种登录方法,在游戏中使用真实身份有助于构建出色的社交功能,从而进一步提升玩家的留存率并吸引更多游戏玩家。

登录是实现其中众多功能的首要步骤,您可以使用以下产品构建这些功能:

请访问 Facebook 游戏平台最佳实践,获取在您的游戏中有效使用 Facebook 登录的更多技巧。