• mfa
  • 2fa
  • totp
  • nodejs
  • security
  • authentication
  • authenticator app
  • otplib

Как реализовать двухфакторную аутентификацию (2FA) в Node.js с помощью приложений-аутентификаторов

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

Yijun
Yijun
Developer

Что такое двухфакторная (2FA) аутентификация

В традиционных приложениях мы обычно используем Email/Имя пользователя/Телефон в качестве идентификаторов личности. Комбинируя эти идентификаторы с соответствующими паролями или проверочными кодами, мы завершаем процесс аутентификации.

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

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

Общие методы 2FA включают:

  • TOTP-аутентификацию с помощью приложений-аутентификаторов
  • Биометрическую аутентификацию
  • Аутентификацию на основе устройства
  • СМС-коды подтверждения

В этом руководстве мы сосредоточимся на реализации двухфакторной аутентификации на основе TOTP с использованием приложений-аутентификаторов и библиотеки otplib в вашем Node.js приложении.

Что такое TOTP-аутентификация?

TOTP обозначает временные одноразовые пароли. Как говорится в Википедии, это компьютерный алгоритм, который генерирует одноразовый пароль, используя текущее время в качестве источника уникальности.

При наличии общего секретного ключа TOTP между телефоном пользователя и сервером приложения, телефон пользователя и сервер приложения могут генерировать один и тот же TOTP-код в одно и то же время:

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

Когда пользователи используют TOTP в качестве метода двухфакторной аутентификации, они часто сталкиваются с проблемой хранения секретного TOTP и генерации TOTP-кодов. Здесь на помощь приходят приложения-аутентификаторы. Мы можем использовать приложения-аутентификаторы для хранения секретного TOTP, и они будут автоматически генерировать TOTP-коды для вас. Когда требуется проверка, вам нужно всего лишь открыть своё приложение-аутентификатор, и вы получите TOTP-код, соответствующий секретному TOTP. Популярные приложения-аутентификаторы включают Google Authenticator и Microsoft Authenticator.

Процесс реализации TOTP в качестве двухфакторной аутентификации включает два этапа:

  1. Привязка секретного TOTP к пользователю.
  2. Проверка TOTP-кода пользователя по связанному секретному TOTP.

Процесс привязки TOTP к пользователю следующий:

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

Как показано на диаграмме, на стороне пользователя мы используем приложения-аутентификаторы для управления секретным TOTP и генерации TOTP-кодов. На стороне сервера мы должны поддерживать генерацию секретного TOTP и проверку TOTP-кода, отправленного пользователем. В этой статье мы будем использовать otplib в качестве примера для интеграции функционала, связанного с TOTP, на стороне сервера.

Реализация двухфакторной аутентификации на основе TOTP с использованием otplib для вашего Node.js приложения

Предположим, ваше приложение основано на Express.js, и пользователи входят через конечную точку /sign-in, план поддержки TOTP в процессе входа пользователя таков:

  1. Когда пользователь не привязан к TOTP, отправьте секретный TOTP пользователю в виде QR-кода и предложите ему привязать TOTP.
  2. Когда пользователь уже привязал TOTP, предложите ему проверить TOTP.

Сначала установим зависимости для проекта: otplib и qrcode:

Далее, давайте улучшить нашу конечную точку /sign-in.

В соответствии с нашей реализацией, когда пользователь не привязан к TOTP, мы отправим QR-код на фронтенд:

Привязка TOTP

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

Google Authenticator

Пользователь отправляет полученный TOTP-код обратно на сервер приложения. Если код был успешно проверен, мы можем затем привязать этот TOTP к пользователю.

Таким образом, давайте реализуем API /verify-totp для приёма TOTP-кода, отправленного пользователем:

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

Проверка TOTP

В API /verify-totp мы используем ранее привязанный секретный TOTP пользователя для проверки TOTP-кода.

Итог

Благодаря этой статье, вы должны теперь уметь интегрировать проверку приложений-аутентификаторов в свои приложения.

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

Хорошая новость: Logto, действуя как комплексное решение для аутентификации личности, предлагает поддержку многофакторной аутентификации (MFA), включая проверку с помощью приложений-аутентификаторов. Используя Logto, вы можете бесшовно интегрировать безопасный и эффективный процесс входа пользователя с MFA в ваше приложение всего за несколько минут!