若啟用重新驗證功能,即使您的應用程式用戶先前已通過驗證,仍可再次確認其身分;而透過「Facebook 登入」功能,應用程式可隨時要求用戶重新輸入 Facebook 密碼。您可利用重新驗證來避免用戶未登出裝置,或第三方入侵用戶應用程式連線階段的情況。
應用程式應該建立自己的機制,使用登出功能在不同的 Facebook 用戶帳號之間切換,而不應依賴重新驗證。
Android 和 iOS SDK 目前都不支援重新驗證。
在您的登入流程期間,我們將向您展示如何使用登入對話方塊和 OAuth 對其他人進行驗證並向他們請求權限。若要重新驗證,您可使用相同步驟,並加上其他參數以強制執行:
auth_type
:此參數指定所請求的驗證功能(以逗號分隔的清單)。有效選項為:reauthenticate
- 無條件地要求用戶重新驗證
auth_nonce
:包含應用程式產生的英數字元 Nonce,可用於提供重新執行保護。如需詳細資訊,請參閱如何檢查 auth_nonce
。
以下是使用 JavaScript SDK,透過 reauthenticate
的 auth_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&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
為重新驗證的選用部分。但仍強烈建議應用程式使用,尤其在請求 reauthenticate
為 auth_type
時。