重新驗證

若啟用重新驗證功能,即使您的應用程式用戶先前已通過驗證,仍可再次確認其身分;而透過「Facebook 登入」功能,應用程式可隨時要求用戶重新輸入 Facebook 密碼。您可利用重新驗證來避免用戶未登出裝置,或第三方入侵用戶應用程式連線階段的情況。

應用程式應該建立自己的機制,使用登出功能在不同的 Facebook 用戶帳號之間切換,而不應依賴重新驗證。

注意

Android 和 iOS SDK 目前都不支援重新驗證。

啟用重新驗證

在您的登入流程期間,我們將向您展示如何使用登入對話方塊和 OAuth 對其他人進行驗證並向他們請求權限。若要重新驗證,您可使用相同步驟,並加上其他參數以強制執行:

  • auth_type:此參數指定所請求的驗證功能(以逗號分隔的清單)。有效選項為:
  • reauthenticate - 無條件地要求用戶重新驗證

  • auth_nonce:包含應用程式產生的英數字元 Nonce,可用於提供重新執行保護。如需詳細資訊,請參閱如何檢查 auth_nonce

以下是使用 JavaScript SDK,透過 reauthenticateauth_type 觸發重新驗證的範例:

FB.login(function(response) {
  // Original FB.login code
}, { auth_type: 'reauthenticate' })

auth_nonce 參數

auth_nonce 參數應為您應用程式產生的完全任意的字母數字代碼。此代碼的產生與格式化程序可完全由您決定。舉例來說,只要在每次嘗試登入時都會產生獨一無二的代碼,由時間戳記和秘密字串組成的雜湊化版本可能就足夠作為此代碼。此值可讓應用程式判斷用戶是否經過重新驗證。

您必須再次修改登入流程以指定 auth_nonce 參數,例如:

FB.login(function(response) {
  // Original FB.login code
}, { auth_type: 'reauthenticate', auth_nonce: '{random-nonce}' })

為了檢查這個 nonce 是否使用過,您需要建立函數來傳遞代碼,以便檢查應用程式的資料庫,查看其是否已使用特定 nonce。

以下是使用 JavaScript(搭配 jQuery 架構)和 PHP 的範例,可作為改寫成適合您特定配置的參考。此範例將使用已硬式編碼的字串作為 nonce。您應該將此方式替換為動態呼叫來產生 nonce。

function checkNonce(access_token) {
  $.post('checkNonce.php', {access_token: access_token}, function(data) {
    if (data == 1) {
      console.log('The user has been successfully re-authenticated.');
      FB.api('/me', function(response) {
  console.log('Good to see you, ' + response.name + '.');
});
    } else {
      console.log('The nonce has been used before. Re-authentication failed.');
    }
  });
}

注意:此 PHP 檔案僅暗示,不包含可將提供的 Nonce 與應用程式資料庫做比較的程式碼片段。您應該修改此程式碼片段,以配合資料庫和程式碼環境:

<?php

  $access_token = $_REQUEST['access_token'];
  $graph_url = 'https://graph.facebook.com/oauth/access_token_info?'
      . 'client_id=YOUR_APP_ID&amp;access_token=' . $access_token;
  $access_token_info = json_decode(file_get_contents($graph_url));

  function nonceHasBeenUsed($auth_nonce) &#123;
      // Here you would check your database to see if the nonce
      // has been used before. For the sake of this example, we'll
      // just assume the answer is "no".
      return false;
  }

  if (nonceHasBeenUsed($access_token_info->auth_nonce) != true) {
      echo '1';
   } else {
      echo '0';
   }
?>

此例中,在從重新驗證登入對話方塊收到存取權杖回應之後,將呼叫 checkNonce() JavaScript 函數。以 JavaScript SDK 作為範例:

FB.login(function(response) {
  if (response.authResponse) {
     // Login success, check auth_nonce...
     checkNonce(response.authResponse.access_token);
  } else {
    // User cancelled
  }
}, { auth_type: 'reauthenticate', auth_nonce: '{random-nonce}' })

請注意,auth_nonce 為重新驗證的選用部分。但仍強烈建議應用程式使用,尤其在請求 reauthenticateauth_type 時。