Использование Speakeasy для создания одноразового пароля - OTP

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

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

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

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

Предварительные требования

· Nodejs установлен на вашем компьютере

· Текстовый редактор

· Браузер Chrome

· Почтальон

Введение

В этом руководстве вы узнаете, как установить двухфакторную аутентификацию в базовом приложении node.js.

Мы будем использовать пакет npm speakeasy, который представляет собой генератор одноразового пароля, идеально подходящий для использования в двухфакторной аутентификации, который поддерживает Google Authenticator и другие двухфакторные устройства. Для установки используем

npm i speakeasy
npm i qrcode // for qrcode

В этом примере мы будем использовать node-json-db в качестве нашей локальной базы данных и uuid для создания случайных уникальных идентификаторов для наших записей.

Реализация

Это трехэтапный процесс

  1. Создать секрет
  2. Покажите QR-код или токен для сканирования пользователем
  3. Выполните аутентификацию токена в первый раз

Создать ключ

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? 🦸‍♂️