使用Express&Node&Passport未定义req.user

时间:2019-09-13 01:37:53

标签: node.js mongodb express mongoose passport.js

我目前正在使用Node + Express + Passport创建一个小型用户身份验证应用程序。用户登录后,他们将自动重新路由到索引页面“ /”,并且通过护照认证建立会话。出于某种原因,尝试console.log(req.user)时,它返回“未定义”。

通过护照进行的身份验证似乎在邮寄路线上正常工作

app.post("/login", passport.authenticate("local", {
    successRedirect: "/home",
    failureRedirect: "/login"
}), (req, res) => {
})

但是没有使用用户模型建立会话。我想最终将userId存储在会话中。这是我目前在服务器文件上设置的用户模型和通行证实现的视图。

const mongoose = require("mongoose");
const passportLocalMongoose = require('passport-local-mongoose');

const userSchema = mongoose.Schema({
    username: String,
    email: String,
    password: String
});

userSchema.plugin(passportLocalMongoose);
const user = mongoose.model("User", userSchema);

module.exports = user;

-----------------------------------------------------------------------------------------

const express = require("express"),
        mongoose = require("mongoose"),
        bodyParser = require("body-parser"),
        session = require("express-session"),
        User = require("./models/user"),
        passport = require('passport'),
        LocalStragety = require('passport-local'),
        app = express();

mongoose.connect("mongodb://localhost/shopping_cart_app", { useNewUrlParser: true })
        .then(console.log("MongoDB Connected"))
        .catch(err => console.log(err));

app.set("view engine", "ejs");
app.use(bodyParser.urlencoded({ extended: true }));
app.use(express.static(__dirname + '/views'));
app.use(session({
        secret: "secret",
        resave: false,
        saveUninitialized: true,
        cookie: { secure: true }
}));
app.use(passport.initialize());
app.use(passport.session());
passport.use(new LocalStragety(User.authenticate()));
passport.serializeUser(User.serializeUser());
passport.deserializeUser(User.deserializeUser());

app.post("/login", passport.authenticate("local", {
        successRedirect: "/home",
        failureRedirect: "/login"
}), (req, res) => {
})

我尝试过更多地研究Passports配置,但是在提供的文档中,它指出一旦passport.authenticate运行,便建立了与用户的会话。任何提示将不胜感激。

谢谢

2 个答案:

答案 0 :(得分:0)

我知道这看起来很简单,但是您尝试过req.body.user吗?

req.body包含用户提交的数据。该文档建议您使用正文分析器填充信息,因为默认情况下未定义信息。但是,我使用Express路由器而不进行解析,而不是使用app对象。

const express = require("express");
const router = express.Router();

router.post("/login", passport.authenticate("local", {
    successRedirect: "/home",
    failureRedirect: "/login"
}), (req, res) => {

    console.log(req.body.user);

})

有关更多信息:req.body

答案 1 :(得分:0)

尝试一下,在我的项目中,它正在工作。

  

LocalStrategy

real    0m6.221s
user    0m18.136s
sys     0m0.004s
  

登录路线

var passport = require('passport'),
    LocalStrategy   = require('passport-local').Strategy;
var mongoose = require('mongoose');
var admins = mongoose.model('admins');
var bCrypt = require('bcrypt-nodejs');
var flash = require('connect-flash');
var moment = require('moment');

// User
passport.serializeUser(function(user, done) {
        done(null, user._id);
});

passport.deserializeUser(function(obj, done) {
  console.log("deserializing " + obj);
  done(null, obj);
});

passport.use('adminlogin',new LocalStrategy(
    function(username, password, done) { 
        admins.findOne({ 'email' :  username },
            function(err, user) {
                //console.log(username);
                if (err)
                    return done(err);
                if (!user){
                    //console.log('Username '+username+' does not Exist. Pleasr try again.');
                    return done(null, false, { message: 'Incorrect Username/Password. Please try again.' });               
                }
                if (!isValidPasswordAdmin(user, password)){
                    //console.log('Invalid Password');
                    return done(null, false, { message: 'Incorrect Password. Please try again.' });
                }
                return done(null, user);
            }
        );

    })
);
var isValidPassword = function(user, app_pin){
    return bCrypt.compareSync(app_pin, user.app_pin);
}

var isValidPasswordAdmin = function(user, password){
    return bCrypt.compareSync(password, user.password);
}

module.exports = passport;