Инструменты пользователя

Инструменты сайта


nodejs:email:stranica_novogo_parolja

страница нового пароля

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>
nodejs/email/stranica_novogo_parolja.txt · Последние изменения: 2023/01/12 12:18 (внешнее изменение)