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

В процессе автоматизации тестирования веб-приложений часто возникает необходимость работы с системами, требующими двухфакторной аутентификации (2FA). Это дополнительный уровень безопасности, который требует от пользователя подтверждения своей личности двумя способами: обычно это что-то, что он знает (например, пароль), и что-то, что он имеет (например, одноразовый код, отправленный на мобильное устройство или через приложение).

Для тестирования таких приложений с использованием Puppeteer потребуется настроить обработку этого дополнительного шага аутентификации. Puppeteer — это мощный инструмент для автоматизации браузера, который позволяет взаимодействовать с веб-страницами как реальный пользователь. Рассмотрим, как можно автоматизировать процесс прохождения двухфакторной аутентификации с использованием Puppeteer.

Настройка Puppeteer

Прежде чем приступить к реализации, нужно убедиться, что Puppeteer правильно настроен. Для этого в проекте должен быть установлен Puppeteer, который можно добавить с помощью команды:

npm install puppeteer

После этого необходимо импортировать библиотеку и настроить браузер:

const puppeteer = require(&

const browser = await puppeteer.launch({ headless: false }); // Открыть браузер в режиме с интерфейсом
const page = await browser.newPage();

Теперь можно приступать к автоматизации процесса авторизации с двухфакторной аутентификацией.

Шаг 1. Авторизация с использованием логина и пароля

Первым шагом является выполнение обычной авторизации с логином и паролем. Это выполняется с использованием методов Puppeteer для взаимодействия с полями ввода на странице:

await page.goto('https://example.com/login'); // Переход на страницу входа
await page.type('#username', 'yourUsername'); // Ввод логина
await page.type('#password', 'yourPassword'); // Ввод пароля
await page.click('#loginButton'); // Нажатие кнопки входа

Шаг 2. Обработка двухфакторной аутентификации

После того как пользователь введет логин и пароль, приложение обычно перенаправит его на страницу двухфакторной аутентификации, где требуется ввести одноразовый код. В зависимости от реализации 2FA, код может быть получен через SMS, через приложение для генерации кодов (например, Google Authenticator), или по ссылке.

Вариант 1: Обработка кода с помощью SMS

Для обработки SMS-услуг, например, с использованием сервиса Twilio, можно интегрировать автоматическую обработку кода. Puppeteer сам по себе не может взаимодействовать с телефоном или получать SMS-сообщения, но вы можете использовать API внешнего сервиса для извлечения кода, а затем вставить его на страницу.

Пример:

const smsCode = await getSmsCodeFromApi(); // API для получения SMS-кода
await page.type('#2fa-code', smsCode); // Ввод кода в поле
await page.click('#submit2fa'); // Отправка формы

Вариант 2: Обработка кода с помощью приложения для 2FA

Если используется приложение для генерации одноразовых кодов, например, Google Authenticator, необходимо извлечь код с помощью соответствующей библиотеки для работы с TOTP (Time-based One-Time Password). Такие библиотеки, как otplib или speakeasy, могут помочь получить текущий код.

Пример с использованием otplib:

npm install otplib
const { authenticator } = require('otplib');
const secret = 'YOUR_SECRET_KEY'; // Секретный ключ для генерации кода

const token = authenticator.generate(secret); // Генерация одноразового кода
await page.type('#2fa-code', token); // Ввод кода на странице
await page.click('#submit2fa'); // Отправка формы

Шаг 3. Обработка возможных ошибок

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

const errorMessage = await page.$eval('.error-message', el => el.textContent);
if (errorMessage.includes('Invalid code')) {
  // Повторить попытку
  const newCode = await getSmsCodeFromApi();
  await page.type('#2fa-code', newCode);
  await page.click('#submit2fa');
}

Шаг 4. Завершение теста

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

await page.close();
await browser.close();

Важные аспекты

  • Безопасность: При тестировании с использованием 2FA важно соблюдать безопасность ваших данных. Например, секретные ключи или пароли не должны храниться в коде в открытом виде, лучше использовать переменные окружения или безопасные хранилища.
  • Синхронизация: Нужно учитывать время задержки, которое может возникнуть при получении одноразового кода, особенно если используется внешняя система для отправки SMS или генерации токенов. В таких случаях можно использовать методы ожидания, например page.waitForSelector() или page.waitForTimeout().
  • Сложности с реальными 2FA: Некоторые системы двухфакторной аутентификации могут требовать дополнительных шагов, таких как подтверждение через мобильное приложение. В таких случаях может понадобиться интеграция с эмуляторами мобильных устройств или специальными API.

Заключение

Автоматизация двухфакторной аутентификации с использованием Puppeteer требует внимательности и адаптации под конкретные реалии тестируемого приложения. Важно понимать, как именно работает система 2FA, и подбирать правильные подходы для получения и ввода кода. Puppeteer предоставляет мощные инструменты для взаимодействия с веб-страницами, что позволяет эффективно тестировать приложения с двухфакторной аутентификацией.