2015-10-19 95 views
2

我的护照中间件不工作。当我在路由上调用passport.authenticate()以确认用户已通过身份验证时,我被重定向到失败页面。然而,登录路由按预期工作,并且我被成功重定向到正确的页面,在该页面中调用失败中间件重定向,并将其发送回登录页面。Passport.js验证始终失败

我有护照的策略,像这样:

module.exports = function(){ 
    var passport = require('passport'); 
    var LocalStrategy = require('passport-local').Strategy 
    var User = require('../models/user'); 
    // used to serialize the user for the session 
    passport.serializeUser(function(user, done) { 
    done(null, user.id); 
    }); 

    // used to deserialize the user 
    passport.deserializeUser(function(id, done) { 
    User.getUserById(id, function(err, user) { 
     done(err, user); 
    }); 
    }); 

    passport.use(new LocalStrategy({ 
    usernameField: "email", 
    passwordField: "password" 
    }, function(email, password, done){ 
    User.getUserByEmail(email, function(err, user){ 
     if(err) throw err; 
     if(!user){ 
     console.log('unknown user'); 
     return done(null, false, {message: 'Email not recognised, please try again'}); 
     } 
     User.comparePassword(password, user.password, function(err, isMatch){ 
     if(err) throw err; 
     if(isMatch){ 
      return done(null, user); 
     } else { 
      console.log('Invalid password'); 
      return done(null, false, { message: 'Password not recognised, please try again' }); 
     } 
     }); 
    }); 
    })); 
}; 

登录优良使用:

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

我的'/客户的途径是像这样,在验证失败并重定向错误地回到登录页面:

router.get('/clients', 
    passport.authenticate("local", { 
    failureRedirect: "/user/login", 
    failureFlash: "not verified" 
    }), function(req, res, next) { 
    res.locals.client = null; 
    Client.find({}) 
    .select("name") 
    .select("_id") 
    .exec(function(err, clients){ 
     res.render('client/views/clients', { 
     title: 'Clients', 
     clients: clients 
     }); 
    }); 
}); 

服务器护照初始化像这样:

//passport 
app.use(passport.initialize()); 
app.use(passport.session()); 
app.use(bodyParser.urlencoded({ extended: false })); 
require("./user/services/passport")(passport); 

我在做什么错?

+0

请显示整个服务器文件。 –

+0

当你在本地策略中注销'email'和'password'时,它们是否存在? – Rick

回答

0

正如您使用failureRedirect:'/ user/login'。它会将您重定向到登录页面。如果您想将其重定向到其他页面,请将failureRedirect值更改为相应的路由。