Оглавление:
Карта сайта:
Оглавление:
Карта сайта:
routes/auth.js
const {Router} = require('express');//модуль express const bcrypt = require('bcryptjs');//Модуль шифрования const User = require('../models/user');//модель пользователя const nodeMailer = require('nodemailer');//mailer const sendGrid = require('nodemailer-sendgrid-transport');//Транспорт для mailer const config = require('../config/config');//конфигурация const regMail = require('../emails/registration');//конфигурация для почтовой рассылки const resetMail = require('../emails/reset');//конфигурация для почтовой рассылки const crypto = require('crypto');//Встроеннная в node.js криптографическая библиотека const router = Router();//инициируем роутер /** * Смена пароля * первый параметр адрес страницы, в данном случае используется префикс при регистрации ройтера, * второй параметр callback - обработчик запроса req - request , запрос от браузера * res - response, ответ сервера */ router.post('/password', async (req, res) => { const {password,confirm, token, userId} = req.body;//данные из формы if(password !== confirm){//сравниваем поля с паролем req.flash('error', 'Пароли не совпадают');//сообщение об ошибке return res.redirect('/auth/password/'+token);//редирект на туже страницу } const user = await User.findOne({//поиск пользователя _id: userId,//id пользователя resetToken: token,//token resetTokenExp: {$gt: Date.now()}//Дата больше текущей иначе ссылка просрочена }); if(user){//Пользователь найден user.password = await bcrypt.hash(password, 10);//Шифруем пароль, 10 - соль user.resetToken = undefined;//обнуляем поля, нужны были тока для защиты формы от взлома user.resetTokenExp = undefined;//обнуляем поля, нужны были тока для защиты формы от взлома user.dtCreate = undefined;//обнуляем поля, нужны были тока для защиты формы от взлома user.save();//Сохраняем измеинения в таблице User return res.redirect('/auth/login#login');//Редирект на страницу авторизации } else{//пользователь не найден или истекло время жизни token req.flash('error', 'Время жизни token истекло');//сообщение об ошибке res.redirect('/auth/login#login'); } }); module.exports = router;//Экспортирум роутер
models/user.js
const {Schema, model} = require('mongoose');//подключаем из библиотеки монго,модульсоздания схемы - Schema, // и модуль регистрации моделей - model /** * Схема пользователя * * В табличке пользователя сразу встраиваем корзину * @type {*|Mongoose.Schema} */ const userSchema = new Schema({ email: {//email type: String, required: true }, name: { //Имя пользователя type: String, //строка }, password: { //Имя пользователя type: String, //строка required: true //поле обязательное }, resetToken:String,//токен для восстановления пароля resetTokenExp: Date,//время жизни токен dtCreate: Date, cart: { //Корзина items: [ //Позиции { count: { //колличество заказанных одинаковых курсов type: Number, //тип число required: true, //поле обязательно default: 1 }, courseId: { type: Schema.Types.ObjectId, //тип ObjectId ref: 'Course', //связка с models/course.js required: true //поле обязательно } } ] } });