重新认证

重新认证功能让应用能确认用户的身份,即使先前已验证过此用户。Facebook 登录功能则让应用可以随时要求用户再次输入他们的 Facebook 密码。这一措施有助于避免用户在某个设备始终保持登录状态,或者防止第三方劫持用户在您应用中的会话。

应用应借助退出功能构建自己的机制来切换不同的 Facebook 用户帐户,而不应使用重新认证来实现此目的。

注意

目前 Android 和 iOS 版 SDK 尚不支持重新认证。

启用重新认证

在您的登录流程中,我们将为您展示如何使用登录对话框以及 OAuth 来进行身份验证并申请权限。如要进行重新认证,您可以使用相同的步骤,并只需额外添加如下参数:

  • auth_type:该参数指定已申请的身份验证功能(以逗号为分隔的列表)。有效选项包括:
  • reauthenticate - 请求用户无条件进行重新认证

  • auth_nonce:包括应用生成的 alphanumeric 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}' })

为检查该随机数之前是否已被使用,您需要创建一个函数,使之与用于检查应用数据库是否已使用特定随机数的代码进行通信。

以下示例使用 JavaScript(配合 jQuery 框架)和 PHP 进行演示,您可以根据应用的具体设置加以改编。在此示例中,我们使用硬编码字符串作为随机数。您应将其替换为对所生成随机数的动态调用。

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 文件仅用于说明(而不包含)可将提供的随机数与应用数据库进行对比的代码片段。您应根据您的数据库和代码环境修改此代码片段:

<?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() JavaScrip 函数。以 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 是重新认证的可选项,但我们强烈建议您在应用中使用它,尤其是在以 auth_type 请求 reauthenticate 时。