Оглавление:
Карта сайта:
Оглавление:
Карта сайта:
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.get('/password/:token', async (req, res) => { if(!req.params.token){//Проверка если токен в ссылке req.flash('Неравильная ссылка');//сообщение обошибке res.redirect('/auth/login#login');//редирект на страницу авторизации } const user = await User.findOne({//поиск пользователя в таблице User resetToken: req.params.token,//поиск по токену resetTokenExp: {$gt: Date.now()}//больше текущей даты }); if(!user){//если пользователь не найден или дата resetTokenExp больше текущей req.flash('error','Ссылка просрочена');//сообщение об ошибке res.redirect('/auth/reset');//редирект на страницу сброса пароля } else{ res.render('auth/password',{//если все условия выполнены рендерим страницу смены пароля //шаблон template/auth/reset.hbs title: 'новый пароль', userId:user._id.toString(),//доп параметр, защита от взлома token: req.params.token,//доп параметр, защита от взлома error: req.flash('error')//вывод в шаблон ошибки, выводим по ключу error }); } }); 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,//время жизни токен cart: { //Корзина items: [ //Позиции { count: { //колличество заказанных одинаковых курсов type: Number, //тип число required: true, //поле обязательно default: 1 }, courseId: { type: Schema.Types.ObjectId, //тип ObjectId ref: 'Course', //связка с models/course.js required: true //поле обязательно } } ] } }); module.exports = model('User', userSchema); //Возврощаем схему, на нее можно вешать различные методы , // в частности update, save, delete и т.д.
template/auth/password.hbs
<div class="row"> <div id="login" class="col s6 offset-s3"> <br> <div class="card"> <div class="card-content"> <span class="card-title"> Новый пароль </span> {{#if error}} <p class="alert">{{error}}</p> {{/if}} <form action="/auth/password" method="post"> <div class="row"> <div class="input-field col s12"> <input id="password" type="text" name="password" class="validate" required /> <label for="password">пароль</label> <span class="helper-text" data-error="введите password" data-success=""></span> </div> <div class="input-field col s12"> <input id="confirm" type="text" name="confirm" class="validate" required /> <label for="confirm">повторите</label> <span class="helper-text" data-error="повторите пароль" data-success=""></span> </div> </div> <div class="row"> <div class="input-field col"> <input type="hidden" name="userId" value="{{userId}}"> <input type="hidden" name="token" value="{{token}}"> <input type="hidden" name="_csrf" value="{{csrf}}"> <input type="submit" class="btn" value="сохранить"> </div> </div> </form> </div> </div> </div> </div>