Что пишут в блогах

Подписаться

Что пишут в блогах (EN)

Разделы портала

Онлайн-тренинги

.
Автоматизация 2FA: TOTP-аутентификация с расшифровкой QR-кода
10.11.2025 00:00

Автор: Green Report
Оригинал статьи
Перевод: Ольга Алифанова

Двухфакторная аутентификация (2FA) жизненно необходима для защиты пользовательских аккаунтов. Одноразовые пароли, основанные на времени (TOTP) – популярный метод 2FA, добавляющий к обычному паролю дополнительный уровень безопасности. Однако ручное тестирование 2FA может быть утомительным для QA-команд, особенно когда приходится сканировать QR-коды и вводить OTP в строго ограниченные временные интервалы.

В этой статье мы рассмотрим, как полностью автоматизировать тестирование 2FA с использованием TOTP, Python, Playwright и декодирования QR-кодов. К концу статьи у вас будет отлаженный подход для эффективной автоматизации двухфакторной аутентификации в ваших тестах.

Зачем автоматизировать 2FA?

2FA критически важна для защиты аккаунтов, но она также создает уникальные сложности при тестировании. Ручное тестирование 2FA зачастую отнимает много времени и сопровождается рисками ошибок, так как требует от тестировщика точного ввода одноразового кода в узком временном окне. При каждом запуске теста необходимо дождаться генерации нового OTP, ввести его вручную и надеяться, что всё пройдет без ошибок. Этот повторяющийся процесс делает ручное тестирование 2FA неэффективным — особенно на больших объемах или в условиях, когда остальная часть приложения уже покрыта автоматизированными тестами.

Автоматизация 2FA дает ключевые преимущества с точки зрения надежности и эффективности. Генерация и проверка OTP происходит быстро и стабильно, что снижает вероятность человеческой ошибки и экономит драгоценное время команды QA. Автоматизация TOTP позволяет проверять 2FA в различных сценариях, обеспечивая постоянство и предсказуемость результатов. Это повышает скорость тестирования и упрощает обнаружение проблем в 2FA на ранних этапах. Более того, автоматизация 2FA упрощает интеграцию проверки безопасности в CI/CD-пайплайны, позволяя запускать тесты при каждом изменении кода.

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

Необходимые нструменты и библиотеки

Чтобы автоматизировать двухфакторную аутентификацию на основе одноразовых паролей (TOTP), нам понадобится несколько ключевых инструментов и библиотек:

  • Playwright — мощный инструмент для автоматизации браузера, который позволяет имитировать действия пользователя и захватывать QR-код, отображаемый на экране активации 2FA.
  • PyOTP — библиотека на Python для генерации TOTP-кодов, которую мы будем использовать для создания одноразовых паролей на основе секрета, встроенного в QR-код.
  • Pyzbar — библиотека для декодирования QR-кодов, позволяющая извлекать TOTP-секрет прямо из изображения QR-кода.
  • Pillow — библиотека для работы с изображениями на Python, необходима для загрузки и обработки изображения QR-кода перед его декодированием.

Установите все необходимые библиотеки с помощью команды:

pip install playwright pyotp pyzbar pillow

Тестовое приложение

Приложение, используемое в этой статье – это веб-приложение для демонстрации двухфакторной аутентификации с использованием TOTP. Процесс входа начинается с ввода имени пользователя и пароля.


Страница входа тестового приложения

После успешного ввода логина и пароля приложение генерирует уникальный QR-код, содержащий TOTP-секрет, который пользователь должен отсканировать для завершения входа.

 

Страница проверки OTP в тестовом приложении

Этап двухфакторной аутентификации (2FA), основанный на этом QR-коде, обеспечивает генерацию уникального одноразового кода (OTP) каждые 30 секунд, что значительно повышает безопасность процесса входа.


Страница успешного входа в тестовом приложении

Шаг 1: Захват QR-кода

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

page.wait_for_selector("#qr-code", timeout=5000)
page.locator("#qr-code").screenshot(path="qr_code_image.png")
print("QR code saved as: qr_code_image.png")

Этот фрагмент кода ожидает появления QR-кода, а затем сохраняет его как изображение под именем qr_code_image.png. Это изображение будет использоваться на следующем этапе для извлечения секретного ключа TOTP.

Шаг 2: Извлечение TOTP-секрета из QR-кода

Сохранив изображение QR-кода, мы можем воспользоваться библиотекой pyzbar для его декодирования и получения URL, содержащего секретный ключ TOTP. Этот ключ необходим для генерации одноразовых кодов (OTP).

from pyzbar.pyzbar import decode
from PIL import Image
import re
 
img = Image.open("qr_code_image.png")
 
decoded_objects = decode(img)
 
for obj in decoded_objects:
qr_text = obj.data.decode('utf-8')
 
match = re.search(r"secret=([A-Z2-7]+)", qr_text)
secret_key = match.group(1) if match else None

Сначала код открывает изображение QR-кода и использует функцию decode из библиотеки pyzbar для его расшифровки. Затем извлекается декодированный текст — обычно это URL-адрес, содержащий параметр secret. С помощью регулярного выражения из этого текста извлекается значение параметра secret и сохраняется в переменной secret_key. Этот ключ необходим для генерации TOTP-кодов в процессе аутентификации.

Шаг 3: Генерация одноразового кода (OTP)

Как только мы получили секретный ключ, можно сгенерировать одноразовый временный пароль (OTP) с помощью библиотеки pyotp. Такой код действителен лишь ограниченное время, что позволяет синхронизировать его с текущим кодом на сервере:

import pyotp
 
totp = pyotp.TOTP(secret_key)
otp = totp.now()
print(f"Generated OTP: {otp}")

Функция totp.now() генерирует OTP, используя текущее время, и код будет действителен в течение короткого интервала, заданного алгоритмом TOTP.

Шаг 4: Автоматизация процесса входа с OTP

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

page.fill("#username", username)
page.fill("#password", password)
page.click("#login-button")
 
page.fill("#otp", otp)
page.click("#verify-button")
 
page.wait_for_selector("#login-success-message", timeout=10000)
print("Login successful!")

Этот фрагмент кода автоматически заполняет поля имени пользователя, пароля и одноразового кода, тем самым полностью имитируя процесс входа с двухфакторной аутентификацией.

Полный сценарий

Ниже представлен полный интегрированный скрипт, объединяющий все предыдущие шаги в единый процесс автоматизированного входа с двухфакторной аутентификацией (2FA):

def login_with_otp(username, password):
with sync_playwright() as p:
browser = p.chromium.launch(headless=False)
page = browser.new_page()
 
try:
page.goto("http://localhost:3000/login")
page.fill("#username", username)
page.fill("#password", password)
page.click("#login-button")
 
page.wait_for_selector("#qr-code", timeout=5000)
page.locator("#qr-code").screenshot(path="qr_code_image.png")
 
secret_key = extract_secret_from_qr("qr_code_image.png")
 
if secret_key:
otp = generate_otp(secret_key)
page.fill("#otp", otp)
page.click("#verify-button")
page.wait_for_selector("#login-success-message", timeout=10000)
print("Login successful!")
else:
print("Failed to extract secret key from QR code.")
finally:
browser.close()

Этот скрипт последовательно проходит через каждый шаг: авторизация, захват и расшифровка QR-кода, генерация OTP и завершение процесса авторизации. Он выдаст ошибку, если QR-код или OTP невалидны, и в результате мы получим надежное и устойчивое решение по автоматизации 2FA.

Лучшие практики автоматизации двухфакторной аутентификации (2FA)

Чтобы автоматизация 2FA была надёжной, безопасной и стабильной, следуйте этим рекомендациям:

  1. 1. Безопасная обработка изображений QR-кодов

QR-коды содержат TOTP-секреты, которые являются чувствительной информацией. Чтобы предотвратить несанкционированный доступ, подумайте, не стоит ли шифровать изображения или хранить их временно, удаляя после завершения теста. Используйте защищённые права доступа к файлам, чтобы другие процессы не могли их прочитать во время выполнения теста.

  1. 2. Не раскрывайте чувствительную информацию

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

  1. 3. Проверка истечения срока действия OTP и дрейфа времени

OTP, как правило, валидны в течение примерно 30 секунд. Добавьте тесты, в которых используется устаревший OTP — результатом должен быть отказ в авторизации. Также подумайте о сценариях, в которых клиентское или серверное время сдвинуто на ±5–10 секунд, и проверьте, как система справляется с временным дрейфом.

  1. 4. Не используйте реальные аккаунты

Тестируя на стейдже, создавайте отдельные тестовые аккаунты с включённой 2FA, чтобы не затронуть реальные учетные записи. Имитируйте или изолируйте тест-окружение от прода, чтобы тестовые данные не вмешивались в реальные данные и авторизацию.

  1. 5. Используйте повторные попытки с умом

Для надежности автоматизации разрешайте ограниченное количество повторных попыток, если валидация OTP случайно падает, но не увлекайтесь. Если ошибки возникают постоянно — это симптом проблем с синхронизацией или стабильностью теста. Устраните основную причину, а не увеличивайте количество попыток – это приведет лишь к ненадежности тестов.

Заключение и дальнейшие шаги

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

Для дальнейшего улучшения рассмотрите возможность интеграции в CI/CD-пайплайн, чтобы автоматизировать тесты 2FA в вашем процессе непрерывного развертывания – это поможет выявлять проблемы на ранних стадиях и поддерживать безопасные, качественные релизы. Если вы хотите опробовать этот подход, полный пример кода с обработкой ошибок, а также тестовое приложение с инструкциями по настройке доступны на нашей странице GitHub. Мы рекомендуем изучить пример, адаптировать его под ваши задачи тестирования и улучшить настройку проверки аутентификации уже сегодня!

Обсудить в форуме