Passport.js中的用户名或密码失败消息

问题描述:

我有使用Passport.js在Express中创建的登录名。现在我已经设置了一切,当用户名和密码正确时,它将重定向到用户页面。但是现在我想在证书不正确时显示一条消息。现在,它导致了一个空白页的自动消息 '未经授权'Passport.js中的用户名或密码失败消息

这是我passport.js设置:

App.js:

var mongoose = require('mongoose'); 
mongoose.Promise = global.Promise; 
mongoose.connect('mongodb://localhost:27017/homeapp'); 

var passport = require('passport'); 
var LocalStrategy = require('passport-local').Strategy; 

app.use(require('express-session')({ 
    secret: 'testtest', 
    resave: false, 
    saveUninitialized: false 
})); 
app.use(passport.initialize()); 
app.use(passport.session()); 
var User = require('./models/User'); 
passport.use(new LocalStrategy(User.authenticate())); 
passport.serializeUser(User.serializeUser()); 
passport.deserializeUser(User.deserializeUser()); 

Index.js

var express = require('express'); 
var router = express.Router(); 
var auth = require('../controller/AuthController.js'); 

router.get('/', auth.home); 

router.get('/login', auth.login); 

router.post('/login', auth.doLogin); 

router.get('/logout', auth.logout); 

module.exports = router; 

Users.js:

var mongoose = require('mongoose'); 
var Schema = mongoose.Schema; 
var passportLocalMongoose = require('passport-local-mongoose'); 

var UserSchema = new Schema({ 
    username: String, 
    password: String 
}, {collection: 'userdata'}); 

UserSchema.plugin(passportLocalMongoose); 

module.exports = mongoose.model('User', UserSchema); 

AuthController.js:

var mongoose = require("mongoose"); 
var passport = require("passport"); 
var User = require("../models/User"); 

var userController = {}; 

userController.home = function(req, res) { 
    res.render('index', { user : req.user }); 
}; 

userController.login = function(req, res) { 
    res.render('login'); 
}; 

userController.doLogin = function(req, res){ 
    passport.authenticate('local')(req, res, function(){ 
    res.redirect('/'); 
    }); 
}; 

userController.logout = function(req, res) { 
    req.logout(); 
    res.redirect('/'); 
}; 

module.exports = userController; 

你可以修改你的代码是这样的:

userController.doLogin = function(req, res){ 
    passport.authenticate('local', { successRedirect: '/', 
            failureRedirect: '/login', 
            failureFlash: true }) 

passport.authenticate('local', { failureFlash: 'Invalid username or 
password.' }); 

};

将failureFlash选项设置为true将指示Passport使用策略的验证回调给出的消息(如果有的话)刷新错误消息。这通常是最好的方法,因为验证回调可以最准确地确定验证失败的原因。

正如,我已经看到你正在使用这本护照自定义回调方法,你可以这样做:

userController.doLogin = function(req, res){ 
passport.authenticate('local', function(err, user) { 
    if (err) { return next(err); } 
    if (!user) { return res.json('invalid credentials'); } 
req.logIn(user, function(err) { 
    if (err) { return next(err); } 
    return res.redirect('/'); 
}); 
})(req, res); 
}; 
+0

如果我用下面的回调,它给我的消息“凭据无效”即使我的密码是正确的 – Larsmanson

+0

我编辑了我的答案请再次检查它 – Sam

+0

Thanx,这对我工作:) – Larsmanson