Как реализовать двухфакторную аутентификацию (2FA) в Node.js с помощью приложений-аутентификаторов
Узнайте, как реализовать двухфакторную аутентификацию (2FA) в Node.js с использованием приложений-аутентификаторов, TOTP и библиотеки otplib. Это пошаговое руководство охватывает все этапы - от генерации QR-кодов до проверки аутентификационных кодов.
Что такое двухфакторная (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 в качестве двухфакторной аутентификации включает два этапа:
- Привязка секретного TOTP к пользователю.
- Проверка TOTP-кода пользователя по связанному секретному TOTP.
Процесс привязки TOTP к пользователю следующий:
После того, как пользователь привязал TOTP, он может использовать его для проверки. Процесс выглядит следующим образом:
Как показано на диаграмме, на стороне пользователя мы используем приложения-аутентификаторы для управления секретным TOTP и генерации TOTP-кодов. На стороне сервера мы должны поддерживать генерацию секретного TOTP и проверку TOTP-кода, отправленного пользователем. В этой статье мы будем использовать otplib в качестве примера для интеграции функционала, связанного с TOTP, на стороне сервера.
Реализация двухфакторной аутентификации на основе TOTP с использованием otplib для вашего Node.js приложения
Предположим, ваше приложение основано на Express.js, и пользователи входят через конечную точку /sign-in
, план поддержки TOTP в процессе входа пользователя таков:
- Когда пользователь не привязан к TOTP, отправьте секретный TOTP пользователю в виде QR-кода и предложите ему привязать TOTP.
- Когда пользователь уже привязал TOTP, предложите ему проверить TOTP.
Сначала установим зависимости для проекта: otplib
и qrcode
:
Далее, давайте улучшить нашу конечную точку /sign-in
.
В соответствии с нашей реализацией, когда пользователь не привязан к TOTP, мы отправим QR-код на фронтенд:
Пользователь сканирует QR-код с помощью приложения-аутентификатора, и приложение-аутентификатор сгенерирует TOTP-код и сохранит связанный секретный TOTP.
Пользователь отправляет полученный TOTP-код обратно на сервер приложения. Если код был успешно проверен, мы можем затем привязать этот TOTP к пользователю.
Таким образом, давайте реализуем API /verify-totp
для приёма TOTP-кода, отправленного пользователем:
Таким образом, мы успешно привязали TOTP для пользователя. Впоследствии, при входе пользователя, ему нужно всего лишь открыть приложение-аутентификатор, отправить код подтверждения, соответствующий ранее привязанному секретному TOTP, и процесс аутентификации будет завершён.
В API /verify-totp
мы используем ранее привязанный секретный TOTP пользователя для проверки TOTP-кода.
Итог
Благодаря этой статье, вы должны теперь уметь интегрировать проверку приложений-аутентификаторов в свои приложения.
Однако, это всего лишь простой пример. Когда ваше приложение большое или, вероятно, станет сложным, интеграция нового метода аутентификации может потребовать значительных затрат.
Хорошая новость: Logto, действуя как комплексное решение для аутентификации личности, предлагает поддержку многофакторной аутентификации (MFA), включая проверку с помощью приложений-аутентификаторов. Используя Logto, вы можете бесшовно интегрировать безопасный и эффективный процесс входа пользователя с MFA в ваше приложение всего за несколько минут!