Реализация подтверждения email'а пользователя, с помощью кода подтверждения в node.js и mongoDB

Я хочу реализовать регистрацию пользователя, с помощью node.js/express.js, пользователь должен указать - email, username и password. После этого, я хочу проверить, является ли email пользователя настоящим, я отправлю письмо с кодом подтверждения на его e-mail, после чего пользователь должен ввести этот код в специальное поле input, и отправить его на сервер, для проверки. И теперь у меня появилась проблема, я не знаю как это правильно организовать, у меня есть 2 варианта, и я не знаю какой из них верный, и более безопасный.

  1. При регистрации, все данные формы (email, username, password), будут записываться в сессию, которая потом будет храниться в базе даннных mongoDB ограниченное количество времени, 10 минут. В течении этого времени, сервер сгенерирует код, который так же сохранится в сессии пользователя. После, сервер отправит пользователю e-mail с кодом, он должен его ввести в специальное поле input, после, он отправит введённый код на сервер, там, сервер возьмет сессию текущего польователя и проверит совпадает ли код введённый пользователем, с кодом в сессии, если да, он создаст полноценную модель пользователя в базе, если нет, отправит ошибку.

  2. При регистрации, все данные формы (email, username, password), сохранятся в базу данных, как схема под именем waiting_user которая будет иметь следующую структуру:

    let waiting_user = new Schema({
      code:{      //код подтверждения
        type: String,
        required: true,
        index: {unique: true}
      },
      email:{
        type: String,
        required: true,
        index: {unique: true}
      },
      username:{
        type: String,
        required: true,
        index: {unique: true}
      },
      password:{
         type: String,
         required: true
      }
     });
    

Эта схема тоже будет храниться в базе ограниченное количество времени, 10 минут, за это время пользователю отправится e-mail с кодом, (который уже сгенерировался и сохранился в схему waiting_user, под ключем code) который он введет в input и отправит на сервер. Там будет происходить немного другая проверка, сервер примет код введённый пользователем, назовём его code, и начнет искать схему по этому коду: wainting_user.find({code: code});, если он найдет схему с таким кодом, то возьмёт от туда данные, и создаст уже полноценную модель пользователя без ограничения по времени. Если нет, значит код был не верным.

Я совершенно не знаю какой подход более правильный и безопастный, хочу попросить помощи у опытных разработчиков, какой метод лучше использовать? Могут ли быть какие-то дыры в безопастности? Заранее спасибо.)!


Ответы (0 шт):