Reautenticación

La reautenticación permite a tu aplicación confirmar la identidad de una persona, aunque ya se haya verificado previamente. Con el inicio de sesión con Facebook, la aplicación puede solicitar a un usuario que vuelva a introducir su contraseña de Facebook en cualquier momento. Se puede utilizar para evitar aquellos casos en los que un usuario deja su sesión iniciada en un dispositivo, o en los que un tercero se hace con el control de una sesión de usuario con tu aplicación.

Las aplicaciones deberían incluir mecanismos propios para cambiar entre distintas cuentas de usuario de Facebook, como funciones de cierre de sesión, y no depender de la reautenticación para ello.

Nota

En este momento, la reautenticación no es compatible con los SDK para iOS y Android.

Activación de la reautenticación

Durante el proceso de inicio de sesión te mostramos cómo usar el cuadro de diálogo de inicio de sesión y OAuth para autenticar a un usuario y solicitarle permisos. Puedes forzar la reautenticación empleando los mismos pasos con parámetros adicionales:

Este es un ejemplo con el SDK para JavaScript que activa la reautenticación con el elemento auth_type del parámetro reauthenticate:

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

Parámetro auth_nonce

El parámetro auth_nonce está pensado como un código alfanumérico totalmente arbitrario que genera la aplicación. El proceso de generación y el formato del código dependen por completo de ti. Por ejemplo, una versión con hash de una marca de tiempo y una cadena secreta podrían ser suficientes, siempre que el código sea único para cada intento de inicio de sesión. Este valor permite a la aplicación determinar si un usuario se ha vuelto a autenticar.

Tendrás que volver a modificar el proceso de inicio de sesión para especificar el parámetro auth_nonce, por ejemplo:

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

Para comprobar que esta cadena no se ha utilizado antes, debes crear una función que se comunique con el código que revisa si la base de datos de la aplicación ya usaba alguna cadena antes.

A continuación se ofrece un ejemplo con JavaScript (con el marco jQuery) y PHP que puedes adaptar a tu configuración concreta. Para nuestro ejemplo, utilizaremos una cadena de codificación fija. Deberías reemplazarla con una llamada dinámica a una cadena generada.

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.');
    }
  });
}

Nota: Este archivo PHP solo implica (sin incluirlo) al fragmento de código que compararía la cadena suministrada con la base de datos de la aplicación. Deberías ajustarlo según sea necesario para tu base de datos y entorno de codificación:

<?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';
   }
?>

En este ejemplo, se llamaría a la función checkNonce() de JavaScript tras recibir la respuesta del identificador de acceso del cuadro de diálogo de inicio de sesión para volverse a autenticar. Consulta el ejemplo siguiente con el SDK para JavaScript:

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}' })

Ten en cuenta que auth_nonce es una parte opcional de la reautenticación. Sin embargo, se recomienda encarecidamente que las aplicaciones lo utilicen, especialmente cuando solicitan la opción reauthenticate en el parámetro auth_type.