Реализация подтверждения email'а пользователя, с помощью кода подтверждения в node.js и mongoDB
Я хочу реализовать регистрацию пользователя, с помощью node.js/express.js, пользователь должен указать - email, username и password. После этого, я хочу проверить, является ли email пользователя настоящим, я отправлю письмо с кодом подтверждения на его e-mail, после чего пользователь должен ввести этот код в специальное поле input, и отправить его на сервер, для проверки. И теперь у меня появилась проблема, я не знаю как это правильно организовать, у меня есть 2 варианта, и я не знаю какой из них верный, и более безопасный.
При регистрации, все данные формы (
email, username, password), будут записываться в сессию, которая потом будет храниться в базе даннныхmongoDBограниченное количество времени, 10 минут. В течении этого времени, сервер сгенерирует код, который так же сохранится в сессии пользователя. После, сервер отправит пользователю e-mail с кодом, он должен его ввести в специальное полеinput, после, он отправит введённый код на сервер, там, сервер возьмет сессию текущего польователя и проверит совпадает ли код введённый пользователем, с кодом в сессии, если да, он создаст полноценную модель пользователя в базе, если нет, отправит ошибку.При регистрации, все данные формы (
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});, если он найдет схему с таким кодом, то возьмёт от туда данные, и создаст уже полноценную модель пользователя без ограничения по времени. Если нет, значит код был не верным.
Я совершенно не знаю какой подход более правильный и безопастный, хочу попросить помощи у опытных разработчиков, какой метод лучше использовать? Могут ли быть какие-то дыры в безопастности? Заранее спасибо.)!