Настройка серверной части для MFA
В первую очередь нужно знать, что для настройки MFA вам потребуется:
- Способ генерировать временные одноразовые пароли (TOTP). Это может быть реализовано с помощью библиотек.
- Средства для отправки кодов пользователю (например, email или SMS).
- Логика проверки правильности введенного кода.
Почему стоит использовать TOTP
TOTP (Time-based One-Time Password) — это алгоритм, который генерирует одноразовый пароль на основе текущего времени. Один из популярных протоколов — это Google Authenticator, который используют многие системы безопасности.
Библиотеки, которые можно использовать для генерации TOTP:
- otplib — популярная библиотека для работы с TOTP.
- speakeasy — альтернативная библиотека с похожими функциями.
Выбор между библиотеками зависит от ваших предпочтений, но для нашего примера мы будем использовать otplib.
Создание и отправка кодов MFA
Настало время немного пописать код. Давайте начнем с настройки серверной части.
Установка необходимых зависимостей
Для начала нам нужна основа: Express (или любой другой сервер), а также библиотека для генерации TOTP.
npm install express otplib nodemailer
express— наш любимый минималистичный веб-фреймворк.otplib— библиотека для генерации временных паролей.nodemailer— библиотека для отправки писем (если вы хотите отправлять коды по email).
Генерация временного кода
import { totp } from 'otplib';
const secret = 'SOME_RANDOM_SECRET'; // Должен храниться безопасно!
// Генерация временного кода
const generateCode = () => {
return totp.generate(secret);
};
console.log('Ваш временный код:', generateCode());
Что здесь происходит:
- Мы определяем секретный ключ
secret. Это случайная строка, которая используется для генерации кодов. - Мы вызываем
totp.generate(secret)и получаем одноразовый код.
секреты пользователей нужно хранить безопасно, например, в базе данных в зашифрованном виде. Никогда не храните их в открытом виде!
Настройка Endpoints для MFA
Создадим маршрут API, который позволяет отправить MFA-код пользователю. Это может быть вызвано, например, при логине.
import express from 'express';
import { totp } from 'otplib';
import nodemailer from 'nodemailer';
const app = express();
const port = 3000;
// Ваш секретный ключ (в реальных приложениях храните его в безопасном месте)
const MFA_SECRET = 'SOME_RANDOM_SECRET';
// Настройка почтового сервера для отправки email
const transporter = nodemailer.createTransport({
service: 'gmail',
auth: {
user: 'your-email@gmail.com',
pass: 'your-email-password',
},
});
app.post('/send-mfa-code', async (req, res) => {
const email = req.body.email;
// Генерация одноразового пароля
const code = totp.generate(MFA_SECRET);
try {
// Отправка кода по email
await transporter.sendMail({
from: '"Your App" <your-email@gmail.com>',
to: email,
subject: 'Ваш код подтверждения',
text: `Ваш код: ${code}`,
});
console.log(`Код отправлен на ${email}: ${code}`);
res.status(200).json({ message: 'Код отправлен' });
} catch (error) {
console.error('Ошибка при отправке email:', error);
res.status(500).json({ message: 'Ошибка при отправке кода' });
}
});
app.listen(port, () => {
console.log(`Сервер работает на http://localhost:${port}`);
});
Вот как это работает:
- Вы генерируете код с помощью
totp.generate. - Отправляете уведомление пользователю (в данном случае через email).
- Возвращаете пользователю успешный ответ.
Подтверждение кода MFA
После того, как пользователь получил код, в следующем шаге он должен ввести его, чтобы подтвердить свою личность. Давайте реализуем валидацию.
otplib предоставляет удобный метод для проверки кода — totp.verify. Он проверяет текущий код, основываясь на секрете и времени.
Вот пример проверки:
app.post('/verify-mfa-code', (req, res) => {
const { code } = req.body;
// Проверка достоверности кода
const isValid = totp.verify({
token: code,
secret: MFA_SECRET,
});
if (isValid) {
res.status(200).json({ message: 'Код подтвержден' });
} else {
res.status(400).json({ message: 'Неверный код' });
}
});
Что здесь происходит:
- Пользователь отправляет код на сервер.
- Сервер использует
totp.verifyдля проверки, правильно ли введен код. - Если код действителен, пользователь подтвержден. Если нет, мы выводим сообщение об ошибке.
Как это всё работает в жизни?
Вот сценарий использования:
- Отправка кода: пользователь заходит в приложение и, например, входит с паролем. Мы генерируем и отправляем ему временный код по email/SMS.
- Ввод кода: пользователь вводит код на экране подтверждения.
- Проверка кода: сервер проверяет код и, если он совпадает, завершает процесс входа.
Типичные ошибки и их устранение
При внедрении MFA вы можете столкнуться с несколькими проблемами:
- Разница во времени между клиентом и сервером: TOTP зависит от времени, поэтому убедитесь, что ваши серверы и устройства синхронизированы.
- Неправильная обработка ошибок: если код вводится неправильно, возвращайте пользователю понятное сообщение — никто не любит абстрактное "ошибка".
- Отсутствие защиты: коды MFA имеют короткий срок действия, но убедитесь, что после нескольких неудачных попыток ввода вы блокируете учетную запись или добавляете защиту от перебора.
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ