Повторная аутентификация

Повторная аутентификация позволяет вашему приложению проверить идентификационные данные пользователя, даже если его личность уже была подтверждена ранее. Функция входа через Facebook позволяет приложению запросить повторный ввод пароля в любой момент. Таким образом можно защитить пользователя, если он забыл выйти с какого-либо устройства, или его активный сеанс взломали.

В приложении должны быть реализованы свои собственные методы смены аккаунтов Facebook с использованием механизма выхода. Разработчикам не следует полагаться на повторную аутентификацию для смены аккаунтов.

Примечание

На данный момент Android SDK и iOS SDK не поддерживают повторную аутентификацию.

Включение повторной аутентификации

В руководстве по входу показано, как использовать диалог входа и OAuth для аутентификации и запроса разрешений. Для повторной аутентификации можно повторить те же действия, добавив дополнительные параметры:

Пример с использованием SDK для JavaScript, в котором повторная аутентификация запускается с помощью auth_type со значением reauthenticate:

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

В этом примере функция JavaScript checkNonce() вызывается после получения ответа с маркером доступа от диалога входа повторной аутентификации. В качестве примера используется SDK для 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}' })

Обратите внимание: auth_nonce — необязательная часть процесса повторной аутентификации. Однако мы рекомендуем использовать этот параметр, особенно если в качестве auth_type используется reauthenticate.