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 上玩過您的遊戲、透過應用程式中心授權,或透過您的流動版遊戲授權。

您可以透過 2 種方式偵測玩家是否曾經登入過您的遊戲:

  • 用戶端,使用 JS SDK FB.getLoginStatus() 方法
  • 伺服器端,透過解碼 signed_request

使用 Facebook JavaScript 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. 使用「.」字元來將簽署要求分隔為 2 個部分(例如:238fsdfsd.oijdoifjsidf899
  2. 從 base64url 編碼來解碼第一部分 (encoded signature)
  3. 從 base64url 解碼第二部分 (payload),然後解碼所得的 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 交換存取憑證,然後使用該憑證存取 Graph API 以進一步提供個人化功能。

首次驗證

當玩家首次體驗您的遊戲時,您應提供「登入」對話框以邀請他們驗證遊戲。我們建議使用 JavaScript SDK 作為用戶端登入驗證流程。開發人員可以在啟用「登入」對話框之前,以及取消該對話框之後,顯示簡單的遊戲圖像。

Happy Acres 在登入時使用自訂背景

使用 JavaScript SDK 的用戶端登入

專為 Facebook 上的遊戲所設計的 JavaScript 版「登入」對話框,會在 iframeasync 模式中觸發。這表示該對話框會連同其他遊戲內容以模態彈出式通知的方式顯示,而非跳出另外一個彈出式瀏覽器視窗。

這個差異很重要,因為對話框可以直接從程式碼觸發,而非作為用戶介面事件的一部分,這樣就可以避免遭到瀏覽器的彈出式視窗偵測方法封鎖。

因此,您可以使用 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 遊戲平台最佳操作實例