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()

下一篇: Extend Kendo HtmlHelpers for TextBoxFor