Использование Speakeasy для создания одноразового пароля - OTP
Сегодня, к сожалению, один только надежный пароль не может гарантировать достаточную безопасность для всех наших учетных записей.
Двухфакторная аутентификация (2FA) или двухэтапная аутентификация - это функция безопасности, которая требует двух вещей для проверки вашей личности. То, что мы не всегда знаем - пароль и вторичный метод, такой как проверочный код или токен. Следовательно, это более безопасно, чем использование одного пароля (однофакторная аутентификация).

Одноразовые пароли обычно отправляются на адрес электронной почты или на телефон пользователя и обычно ограничены по времени, а поскольку к ним может получить доступ кто-то с вашего телефона, они менее безопасны.
С другой стороны, приложения Authenticator более безопасны, поскольку они связаны только с одним устройством. Чтобы использовать это, нам нужно использовать приложение для аутентификации (аутентификатор Google) и подключиться к нему, введя код связи или отсканировав QR-код.

Предварительные требования
· Nodejs установлен на вашем компьютере
· Текстовый редактор
· Браузер Chrome
Введение
В этом руководстве вы узнаете, как установить двухфакторную аутентификацию в базовом приложении node.js.
Мы будем использовать пакет npm speakeasy, который представляет собой генератор одноразового пароля, идеально подходящий для использования в двухфакторной аутентификации, который поддерживает Google Authenticator и другие двухфакторные устройства. Для установки используем
npm i speakeasynpm i qrcode // for qrcode
В этом примере мы будем использовать node-json-db в качестве нашей локальной базы данных и uuid для создания случайных уникальных идентификаторов для наших записей.
Реализация
Это трехэтапный процесс
- Создать секрет
- Покажите QR-код или токен для сканирования пользователем
- Выполните аутентификацию токена в первый раз
Создать ключ
const speakeasy = require('speakeasy')
const QRCode = require('qrcode')
// generate a secret key
var temp_secret = speakeasy.generateSecret();
Чтобы сгенерировать QR-код, мы используем npm qrcode, у которого есть метод toDataURL(), и помещаем его в нашу базу данных.
// generate a QR Code
const qrcode = await QRCode.toDataURL(temp_secret.otpauth_url)
db.push(path, { id: id, temp_secret, data_url: qrcode });
Вывод

Проверка токена
В этом случае мы будем использовать почтальон и отправлять токен из аутентификатора Google и userID в качестве тела из request. Мы вручную вводим ключ temp_secret, чтобы получить токен, основанный на времени.
В POST request api/verify:
const {token, userId} = req.body // get body of request
const path = `/user/${userId}`
// get user with the id from the path
const user = db.getData(path)
// Generate a time-based token based on the base-32 key.
const { base32: secret} = user.temp_secret
const verified = speakeasy.totp({
secret,
encoding: 'base32',
token
});
Вывод

Весь код можно найти на моем Github или по сути
Заключение
Вы только что узнали, как настроить для своих веб-приложений двухфакторную аутентификацию с одноразовыми паролями.
Теперь, когда у вас есть секретные токены, почему бы не реализовать собственное приложение для генерации токенов TOTP? 🦸♂️