A reautenticação permite que o seu aplicativo confirme a identidade de uma pessoa, mesmo que tenha sido verificada anteriormente. O Login do Facebook permite que o aplicativo solicite que a pessoa insira novamente a senha do Facebook a qualquer momento. Você pode usar esse recurso para evitar casos em que um usuário deixa um dispositivo conectado ou em que um terceiro sequestra a sessão de alguém com o seu aplicativo.
Os aplicativos devem criar seus próprios mecanismos para alternar entre diferentes contas de usuário do Facebook usando funções de saída e não devem depender de reautenticação para isso.
No momento, o Android SDK e o SDK do iOS não dão suporte à reautenticação.
Durante o seu fluxo de login, mostraremos como usar o diálogo Entrar e OAuth para autenticar pessoas e para solicitar permissões delas. Para reautenticar, você pode usar essas mesmas etapas com parâmetros adicionais para forçá-la:
auth_type
: esse parâmetro especifica os recursos de autenticação solicitados (como uma lista separada por vírgulas). As opções válidas são:reauthenticate
: pede que a pessoa execute a reautenticação incondicionalmente
auth_nonce
: inclui um nonce alfanumérico gerado por aplicativo que pode ser usado para fornecer proteção contra reprodução. Veja como verificar a existência de auth_nonce
para saber mais.
Veja um exemplo que usa o SDK do JavaScript que dispara a reautenticação usando um auth_type
de reauthenticate
:
FB.login(function(response) { // Original FB.login code }, { auth_type: 'reauthenticate' })
auth_nonce
O parâmetro auth_nonce
serve como um código alfanumérico totalmente aleatório gerado pelo seu aplicativo. O processo de geração e formatação desse código é totalmente por sua conta. Por exemplo, uma versão com hash de um registro de data e hora e uma cadeia de caracteres pode ser suficiente, desde que seja totalmente exclusiva a cada tentativa de login. Esse valor permite que o seu aplicativo determine se um usuário foi reautenticado.
Será necessário modificar novamente seu fluxo de login para especificar o parâmetro auth_nonce
, por exemplo:
FB.login(function(response) { // Original FB.login code }, { auth_type: 'reauthenticate', auth_nonce: '{random-nonce}' })
Para verificar se esse nonce não foi usado antes, você precisa criar uma função para se comunicar com o código que verifica o banco de dados do aplicativo a fim de ver se ele já usou um determinado nonce.
Veja abaixo um exemplo de como usar JavaScript (com a estrutura jQuery) e PHP como um guia que você pode adaptar de acordo com a sua própria configuração específica. Para nosso exemplo, usaremos uma cadeia de caracteres codificada como o nonce. É preciso substituí-la por uma chamada dinâmica para um nonce gerado.
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: esse arquivo PHP apenas indica, e não inclui, o trecho de código que compararia o nonce fornecido com o banco de dados do aplicativo. É preciso personalizá-lo para o seu próprio banco de dados e ambiente de código:
<?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'; } ?>
Nesse exemplo, a função de JavaScript checkNonce()
seria chamada após o recebimento da resposta do token de acesso do diálogo de login de reautenticação. Como usar o SDK do JavaScript como exemplo:
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}' })
Note que auth_nonce
é uma parte opcional da reautenticação. Contudo, incentivamos que os aplicativos o utilizem, principalmente ao solicitar reauthenticate
como auth_type
.