NodeJS Как генерировать пароль в Passport?

Код регистрации через Passport выглядит следующим образом:
const LocalStrategy   = require('passport-local').Strategy;
const User       		= require('../app/models/user');
const randomPass = require('randomstring');

module.exports = function(passport) {
    passport.serializeUser(function(user, done) {
        done(null, user.id);
    });

    passport.deserializeUser(function(id, done) {
        User.findById(id, function(err, user) {
            done(err, user);
        });
    });

passport.use('local-signup', new LocalStrategy({
        usernameField : 'email',
        passwordField : 'password',
        passReqToCallback : true 
    },
    function(req, email, password, done) {
          User.findOne({ 'local.email' :  email.toLowerCase() }, function(err, user) {
            if (err)
                return done(err);

            if (user) {
                return done(null, false, req.flash('signupMessage', 'Адрес электронной почты уже занят'));
            } else {
                var newUser            = new User();
                newUser.local.email    = email.toLowerCase();
                newUser.local.password = newUser.generateHash(password);

                newUser.save(function(err) {
                    if (err)
                        throw err;
                    return done(null, newUser);
                });
            }
        });
    }));

Здесь Passport принимает поле email и password и уже выполняет регистрацию. Но мне необходимо пароль генерировать случайно, через randomPass.generate(7). Как исправить код, чтобы Passport получал только поле email, а пароль уже генерировал случайным образом?
  • Вопрос задан
  • 267 просмотров
Решения вопроса 1
@Abcdefgk
var newUser            = new User();
newUser.local.email    = email.toLowerCase();
password = randomPass.generate(7);
newUser.local.password = newUser.generateHash(password);
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
SagePtr
@SagePtr
Еда - это святое
Проще свой роут написать, который будет из req.body брать поле логина, проверять, есть ли такой юзер в базе и если нет - добавлять в бд и вызывать метод req.login от паспорта для входа свежезарегенного пользователя.
'local-signup' в комплекте с паспортом - ущербный, если нужно что-то отличное от дефолтной пары логин-пароль.
Ответ написан
@Sardort2001
const { Router } = require('express')
const router = Router()
const Users = require('../models/Users')
const bcrypt = require('bcryptjs')
const fileUpload = require('../middleware/fileUpload.js')

router.get('/signin', (req, res, next) => {
    res.render('user/signin', {
        title: 'User sign in'
    })
})

router.get('/signout', (req, res) => {
    req.session.destroy(() => {
        res.redirect('/user/signin')
    })
})

router.post('/signin', async (req, res) => {
    try {
        const { nickname, password } = req.body


        const candidateUser = await Users.findOne({ nickname })
        if (candidateUser) {
            const areSame = await bcrypt.compare(password, candidateUser.password) //true || false
            if (areSame) {
                req.session.userAuth = true
                req.session.users = candidateUser
                res.redirect('/users')
            } else {
                res.redirect('/user/signin')
            }
        } else {
            res.redirect('/user/signin')
        }
    } catch (error) {
        console.log(error);
    }
});

router.get('/signup', (req, res) => {
    res.render('user/signup', {
        title: 'User sign up'
    })
})

router.post('/signup', async (req, res) => {
    const { nickname, name, password } = req.body
    const userHasPassword = await bcrypt.hash(password, 10)

    const users = new Users({
        nickname,
        name,
        password: userHasPassword,
    })

    await users.save()
    res.redirect('/user/signin')
})


module.exports = router
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы