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

使用 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 上載入遊戲時,系統會向您指定的 Facebook 網頁遊戲網址發出 HTTP POST 要求。此 POST 要求將包含一些參數,其中包括可用於授權的 signed_request 參數。

signed_request 是以 base64url 編碼,並簽署 HMAC 版本的「應用程式密鑰」(以 OAuth 2.0 規格為基礎)。

這表示當應用程式收到 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 上的遊戲最佳作法