Повторная аутентификация позволяет вашему приложению проверить идентификационные данные пользователя, даже если его личность уже была подтверждена ранее. Функция входа через Facebook позволяет приложению запросить повторный ввод пароля в любой момент. Таким образом можно защитить пользователя, если он забыл выйти с какого-либо устройства, или его активный сеанс взломали.
В приложении должны быть реализованы свои собственные методы смены аккаунтов Facebook с использованием механизма выхода. Разработчикам не следует полагаться на повторную аутентификацию для смены аккаунтов.
На данный момент Android SDK и iOS SDK не поддерживают повторную аутентификацию.
В руководстве по входу показано, как использовать диалог входа и OAuth для аутентификации и запроса разрешений. Для повторной аутентификации можно повторить те же действия, добавив дополнительные параметры:
auth_type
— запрошенные функции аутентификации в виде списка, разделенного запятыми. Возможные значения:reauthenticate
— запрашивает у пользователя разрешение на повторную аутентификацию без дополнительных условий.
auth_nonce
— включает сгенерированную приложением случайную комбинацию букв и цифр, которая позволяет избежать атак повторного воспроизведения. Подробнее о том, как проверить значение auth_nonce
…
Пример с использованием 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&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
.