JavaRush /Курсы /Модуль 3: React /Настройка API для работы с MFA — отправка кодов и подтвер...

Настройка API для работы с MFA — отправка кодов и подтверждение

Модуль 3: React
16 уровень , 1 лекция
Открыта

Настройка серверной части для MFA

В первую очередь нужно знать, что для настройки MFA вам потребуется:

  1. Способ генерировать временные одноразовые пароли (TOTP). Это может быть реализовано с помощью библиотек.
  2. Средства для отправки кодов пользователю (например, email или SMS).
  3. Логика проверки правильности введенного кода.

Почему стоит использовать 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());

Что здесь происходит:

  1. Мы определяем секретный ключ secret. Это случайная строка, которая используется для генерации кодов.
  2. Мы вызываем 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}`);
});

Вот как это работает:

  1. Вы генерируете код с помощью totp.generate.
  2. Отправляете уведомление пользователю (в данном случае через email).
  3. Возвращаете пользователю успешный ответ.

Подтверждение кода 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: 'Неверный код' });
  }
});

Что здесь происходит:

  1. Пользователь отправляет код на сервер.
  2. Сервер использует totp.verify для проверки, правильно ли введен код.
  3. Если код действителен, пользователь подтвержден. Если нет, мы выводим сообщение об ошибке.

Как это всё работает в жизни?

Вот сценарий использования:

  1. Отправка кода: пользователь заходит в приложение и, например, входит с паролем. Мы генерируем и отправляем ему временный код по email/SMS.
  2. Ввод кода: пользователь вводит код на экране подтверждения.
  3. Проверка кода: сервер проверяет код и, если он совпадает, завершает процесс входа.

Типичные ошибки и их устранение

При внедрении MFA вы можете столкнуться с несколькими проблемами:

  • Разница во времени между клиентом и сервером: TOTP зависит от времени, поэтому убедитесь, что ваши серверы и устройства синхронизированы.
  • Неправильная обработка ошибок: если код вводится неправильно, возвращайте пользователю понятное сообщение — никто не любит абстрактное "ошибка".
  • Отсутствие защиты: коды MFA имеют короткий срок действия, но убедитесь, что после нескольких неудачных попыток ввода вы блокируете учетную запись или добавляете защиту от перебора.
2
Задача
Модуль 3: React, 16 уровень, 1 лекция
Недоступна
Создание API для отправки кодов MFA
Создание API для отправки кодов MFA
Комментарии
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ