我的 Passport.js 配置如下:
const Local = require("passport-local").Strategy;
const USMODEL = require("../models/user.js");
passport.serializeUser(function(user, done) {
console.log("SERIALIZING USER");
done(null, user.id);
});
passport.deserializeUser(function(id, done) {
console.log("DESUSER", id);
var US = mongoose.model("RegUser", USMODEL);
US.findById(id, function(err, user) {
done(err, id);
});
});
passport.use("local-login", new Local({
usernameField: "email",
passwordField: "password",
passReqToCallback: true
},function(req, email, password, done) {
var US = mongoose.model("RegUser", USMODEL);
US.findOne({"email": email}, function(err, user){
if(err) throw err;
if(!user) return done(null, false);
if(!user.validPassword(password)) {
console.log("password not valid");
return done(null, false);
}
return done(null, user);
});
}));
我正在更改每个函数中的猫鼬模型,因为我一次处理多个集合,并且我喜欢完全控制正在发生的事情。
我的 router.js 文件具有以下使用护照中间件的路径:
app.get("/user/login", function(req, res) {
res.render("signin");
});
app.post('/user/login', function (req, res){
passport.authenticate('local-login', function(err, user, info){
if (err) return res.redirect("/");
if (!user) return res.redirect('/');
else {
req.login(user, function(err) {
if (err) return next(err);
console.log("Request Login supossedly successful.");
return res.redirect('/admin/filter');
});
}
})(req, res);
});
身份验证成功后,会重定向到同一路由器中的 /admin/filter ,如下所示。
app.get("/admin/filter", isLoggedIn, function(req, res){
//rendering stuff here
});
现在,管理/过滤器请求经过一个名为的中间件isLoggedIn
从理论上讲,这可以保护我的端点。事情是这样的:
function isLoggedIn(req, res, next) {
console.log("This is the authentication middleware, is req authenticated?");
console.log(req.isAuthenticated());
console.log("Does req.user exist?")
console.log(req.user);
return next();
}
现在,您可能会期望,因为我调用了 req.login 并且我被重定向到我选择的端点,所以请求将被验证。不是这种情况。
Request Login supossedly successful.
This is the authentication middleware, is req authenticated?
false
Does req.user exist?
undefined
我似乎找不到问题的根源。当策略被调用时,一切都检查完毕,以及回调函数和req.login
理论上,这将导致req.user
包含数据的对象。我观察到的一件奇怪的事情是我没有看到passport.deserializeUser()
方法在行动。曾经。但这可能与问题无关。 Passport 肯定使用了我的策略并渲染了一个用户对象,但不知何故,这个相同的对象没有进入请求。您对正在发生的事情有什么建议或想法吗?