重新认证功能让应用能确认用户的身份,即使先前已验证过此用户。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&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()
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
时。