重新驗證

重新驗證可讓您的應用程式確認用戶身分,即使對方先前已完成身分驗證也一樣。您的應用程式可透過 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) {
      // 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 時。