首页 > 解决方案 > 登录页面出现问题 使用身份验证

问题描述

当我注册一封新邮件时,它会重定向到登录页面,在router.post('/login')我添加successRedirect: '/' and failureRedirect: '/test'但无论如何它重定向到/test即使它成功!

index.js

var express = require('express');
var router = express.Router();
const users = require('../model/db');
const { check, validationResult } = require('express-validator');
const passport = require('passport');

//GET login
router.get('/login', (req, res, next)=>{res.render('login')});
router.post('/login', passport.authenticate('local', {
  successRedirect: '/',
  failureRedirect: '/test',
  failureFlash: true,
}));

router.get('/signup', function (req, res, next){
  const msg = req.flash('error')
  res.render('signup');
});

router.post('/signup',  [
    check('password').isLength({ min: 5 }).withMessage('Please enter Password with more than 5 letters!'),
    check('password').not().isEmpty().withMessage('Please fill password fie'),
    check('repassword').custom((val, {req})=>{
      if(val !== req.body.password){
        throw new Error('Password is not equal to confirm password');
      }
      return true;
    })
  ],
  function (req, res, next){
    const newUser = new users({
      email : req.body.email,
      password : new users().hashPassword(req.body.password)
    });
    users.findOne({email : req.body.email}, (err, doc)=>{
      if(err){
        console.log('ERR while getting username =>' + err);
        return ;
      }
      if(doc){
        res.send('this email is already registered before!');
        return ;
      }
      newUser.save((err, doc)=>{
          if(err){
            console.log('err' + err)
          }else{
            res.redirect('/login')
          }
        });
    }); 
    // Finds the validation errors in this request and wraps them in an object with handy functions
    const errors = validationResult(req);
    if (!errors.isEmpty()) {
      var validationMessage = [];
    for(var i = 0; i<errors.errors.length; i++){
      validationMessage.push(errors.errors[i].msg);
    }
    req.flash('error', validationMessage)
      res.redirect('signup')
    } 
});
module.exports = router;

根据这两行代码,

router.post('/login', passport.authenticate('local', {
  successRedirect: '/',
  failureRedirect: '/test',
  failureFlash: true,
}));

如果失败,它应该将我重定向/ test ,如果成功,它应该重定向到 /

登录.hbs

<div class="container">
    <div class="s-f">
        <div class="card">
            <div class="card-body">
                <div>
                    <h6>Log in | <a href='/' target="_blank">Coursatak</a></h6>
                </div>
                <form action="/login" method="post">

            <div class="form-group">
                <label for="email">Email</label>
                <input type="text" name="email" id="email" class="form-control">
            </div>
            <div class="form-group">
                <label for="password">Password</label>
                <input type="password" name="password" id="password" class="form-control">
            </div>
            <div class="form-group">
                <button type="submit" class="btn btn-primary"> Sign Up</button>
            </div>
            <div>
                <p class='if'></span><a href="/signup">Sign Up</a>, <span>If you already registered before.</p>
            </div>
            </form>
        </div>
    </div>
</div>
</div>

配置/配置.js

 const LocalStrategy = require('passport-local').Strategy;
 const bcrypt = require('bcryptjs');
 const User = require('../model/students');
 module.exports = function(passport) {
   passport.use(
     new LocalStrategy('local', { usernameField: 'email' }, (email, password, done) => {
       // Match user
       User.findOne({email: email}).then(user => {
         if (!user) {
           return done(null, false, { message: 'That email is not registered' });
         }
         bcrypt.compare(password, student.password, (err, isMatch) => {
           if (err) throw err;
           if (isMatch) {
             return done(null, user);
           } else {
             return done(null, false, { message: 'Password incorrect' });
           }
         });
       });
     })
   );
 };

架构

const mongoose = require('mongoose');
const bcrypt = require('bcrypt-nodejs');
const stDB = mongoose.Schema({
    email : {
        type: String,
        required: true
    },
    password : {
        type: String,
        required: true
    }
});
stDB.methods.hashPassword = function(password){
    return bcrypt.hashSync(password, bcrypt.genSaltSync(10));
}
stDB.methods.comparePasswords = (password, hash) => {
    return bcrypt.compareSync(password,hash)
}
module.exports = mongoose.model('db', stDB);

节点版本:10.16.1

快捷版:4.16.1

标签: node.jsmongodbexpressmongoosepassport.js

解决方案


我不知道您的 app.js 文件中有什么,但是将以下代码片段粘贴到您的 app.js 文件中并关闭 config/conficuration.js

var passport = require('passport');
var LocalStrategy = require('passport-local').Strategy;
//after your modules

//passport login local login system
passport.serializeUser(function (user, done) {
  //console.log('in serializeUser method user:' + user);
  done(null, user.id);
});

passport.deserializeUser(function (id, done) {
  //console.log('in deserializeUser method id:' + id);
  User.findById(id, function (err, user) {
    done(err, user);
  });
});



passport.use(
 new LocalStrategy('local', { usernameField: 'email' }, (email, password, done) => {
   // Match user
   User.findOne({email: email}).then(user => {
     if (!user) {
       return done(null, false, { message: 'That email is not registered' });
     }
     bcrypt.compare(password, student.password, (err, isMatch) => {
       if (err) throw err;
       if (isMatch) {
         return done(null, user);
       } else {
         return done(null, false, { message: 'Password incorrect' });
       }
     });
   });
 })
);

//after you initialize your sessions
app.use(passport.initialize());
app.use(passport.session());

推荐阅读