我使用express mongodb和passportjs设置了一个相当简单的登录应用程序
一切似乎都正常,除了当我发布到登录路由时,我得到用户对象返回给我而不是主页路由,我很困惑,我已经查看了护照文档,但不确定是什么原因造成的.
Server.js 代码
app.use(passport.initialize());
app.use(passport.session());
passport.serializeUser(function (user, done) {
//console.log('Serialise User Called ' + user.id);
done(null, user.id)
});
passport.deserializeUser( async function (id, done) {
try {
//console.log('Deserilise user called ' + id);
id = await User.findById(id).exec();
console.log(id);
done(id)
} catch (error) {
done(error)
}
});
passport.use(new LocalStrategy(async function (username, password, done) {
try {
const user = await User.findOne({ username: username }).exec();
if(!user) return done(null, false, {message: 'Incorrect username'})
bcrypt.compare(password, user.password, function (err, res) {
if (err) return done(err);
if(res === false) return done(null, false, {message: 'Incorrect Password'})
console.log('finished localstrategy');
return done(null, user);
})
} catch (error) {
console.log('Local strat error' + error);
done(null, error)
}
}));
// app.get("/", isLoggedIn, function (req, res) {
// res.redirect("home");
// });
app.use("/", loginRouter)
app.use("/home", isLoggedIn, homeRouter)
app.use('/register', registerRouter)
app.use('/list', isLoggedIn, listRouter)
app.use('/login', loginRouter)
app.use('/logout', logoutRouter)
app.use('/request', isLoggedIn, requestRouter)
function isLoggedIn(req, res, next) {
if (req.isAuthenticated()){
console.log('Authenticated');
return next();
}
console.log('Not authenticated');
res.redirect("/login");
}
login.js 路由器
const express = require('express')
const router = express.Router()
const User = require("../models/User.js");
const bcrypt = require('bcrypt')
var passport = require("passport")
router.get("/", function (req, res) {
console.log('Login called');
res.render("login");
});
router.post("/",function (req, res, next) {
console.log('Login post called');
next();
}, passport.authenticate('local', {
successRedirect: '/home',
failureRedirect: '/login?error=true'
}));
module.exports = router
抱歉,如果这个问题非常明显,控制台也会记录以下内容;
{
_id: new ObjectId("64dfe4319cc137b5818cfeda"),
username: 'john3',
password: '$2b$10$lpEwg.KHmAoBFx2bu5WD8.4U/blUB1UZT1r5I4O9lt2kustP6HyNK',
__v: 0
}
{
_id: new ObjectId("64dfe4319cc137b5818cfeda"),
username: 'john3',
password: '$2b$10$lpEwg.KHmAoBFx2bu5WD8.4U/blUB1UZT1r5I4O9lt2kustP6HyNK',
__v: 0
}
因此它正在获取用户并验证并在屏幕上显示上述正确的用户,但返回给用户的 html 标题显示错误。
我已经尝试过并记录每个步骤,以确保它按预期运行代码,并且它似乎击中了除主路由之外的所有路由,并提供了用户对象
回答我自己的问题,
我从 deserializeUser 函数返回用户作为错误而不是 null,
1条简单的线
来自
passport.deserializeUser( async function (id, done) {
try {
//console.log('Deserilise user called ' + id);
id = await User.findById(id).exec();
console.log(id);
done(id)
} catch (error) {
done(error)
}
});
到
passport.deserializeUser( async function (id, done) {
try {
//console.log('Deserilise user called ' + id);
id = await User.findById(id).exec();
console.log(id);
**done(null, id)**
} catch (error) {
done(error)
}
});