Passport.js未通过req.login()传递用户请求
我的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);
});
其中,成功验证后,重定向到/管理/过滤器在同样的路由器,就像这样。
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绝对使用我的策略并呈现用户对象,但不知何故,这个相同的对象不会进入请求。 你有什么建议或想法是怎么回事?
我在第一次学习如何使用Passport中间件时,通过与我开始的教程混合解决了这个问题。 原来我在做配置错误:我的代码在服务器文件中曾经是这样的:
pass = require("passport");
app.use(pass.initialize());
app.use(pass.session());
require("./app/config/passport.js")(pass);
当它应该是这样的:
pass = require("passport");
require("./app/config/passport.js")(pass);
app.use(pass.initialize());
app.use(pass.session());
要么我错过了文档中指定配置必须在初始化之前出现的部分,或者只是简单地将其注释为重要的简单事情。 无论哪种方式,我解决了我的问题。
链接地址: http://www.djcxy.com/p/79895.html上一篇: Passport.js is not passing user to request in req.login()