La reautenticación permite que tu app confirme la identidad de una persona aunque se haya verificado previamente. El inicio de sesión de Facebook permite que tu app le pueda pedir 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 un dispositivo conectado o en los que un tercero se apropia de la sesión de alguien con tu app.
Las app deberían incorporar sus propios mecanismos para cambiar entre diferentes cuentas de usuario de Facebook utilizando funciones de cierre de sesión y no depender de la reautenticación para este fin.
Actualmente, los SDK de Android y iOS no son compatibles con la reautenticación.
Durante el proceso de inicio de sesión te mostramos cómo usar el 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:
auth_type
: este parámetro especifica las funciones de autenticación solicitadas (como una lista separada por comas). Las opciones válidas son:reauthenticate
: le solicita al usuario que vuelva a autentificarse incondicionalmente
auth_nonce
: incluye un valor de seguridad alfanumérico generado por la app, que se puede utilizar para proporcionar protección contra ataques de repeticiones. Consulta cómo comprobar un elementoauth_nonce
para obtener más información.
Este es un ejemplo con el SDK para JavaScript que activa la reautenticación utilizando la opción auth_type
del parámetro reauthenticate
:
FB.login(function(response) { // Original FB.login code }, { auth_type: 'reauthenticate' })
auth_nonce
El parámetro auth_nonce
está diseñado para ser un código alfanumérico totalmente arbitrario que tu aplicación genera. El proceso de generación y el formato del código dependen totalmente de ti. Por ejemplo, una versión con hash de una marca de tiempo y una cadena secreta puede ser suficiente, siempre y cuando sea completamente única para cada intento de acceso. Este valor permite que tu aplicación determine si se volvió a autenticar a un usuario.
Tendrá que volver a modificar tu flujo 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 este nonce no se utilizó antes, debes crear una función que se comunique con el código que comprueba la base de datos de tu aplicación para ver si ya se utilizó ese nonce en particular.
A continuación, se ofrece un ejemplo con JavaScript (con el marco jQuery) y PHP que puedes adaptar a tu configuración específica. Para nuestro ejemplo, utilizaremos como nonce una cadena predefinida en el código. Deberías reemplazar esto con una llamada dinámica a un nonce generado.
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, y no incluye, el fragmento de código que compararía el nonce suministrado con la base de datos de la aplicación. Deberías realizar los ajustes apropiados para tu base de datos y tu 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&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 la función JavaScript checkNonce()
después de recibir la respuesta del identificador de acceso del cuadro de diálogo de inicio de sesión reautenticado. Uso del SDK para JavaScript como ejemplo:
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. Se recomienda encarecidamente que las aplicaciones lo utilicen, especialmente cuando solicitan la opción reauthenticate
en el parámetro auth_type
.