【问题标题】:req.user undefined using Express & Node & Passportreq.user undefined using Express & Node & Passport
【发布时间】:2020-01-14 21:34:00
【问题描述】:

我目前正在使用 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 运行,就会建立与用户的会话。任何提示将不胜感激。

谢谢

【问题讨论】:

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


    【解决方案1】:

    我知道这可能看起来很简单,但你试过req.body.user吗?

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

    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

    【讨论】:

      【解决方案2】:

      试试这个,在我的项目中,它正在工作。

      本地策略

      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;
      

      登录路径

      router.post('/login', function (req, res, next) {
          admins.find({}, function (err, user) {
              if (err) {
                  console.log('internal database error');
                  req.flash('error', 'Database Error');
                  res.redirect('/admins');
              } else {
                  passport.authenticate('adminlogin', function (err, user, info) {
                      if (err) {
                          console.log(err);
                          req.flash('error', 'Database Error');
                          res.redirect('/admins');
                      } else if (!user) {
                          req.flash('error', info.message);
                          res.redirect('/admins');
                      } else {
                          req.logIn(user, function (err) {
                              if (err) {
                                  req.flash('error', 'Database Error');
                                  res.redirect('/admins');
                              } else {
                                  res.redirect('/admins/home');
                              }
                          });
                      }
                  })(req, res, next);
              }
          });
      });
      

      【讨论】:

        猜你喜欢
        • 2014-08-08
        • 1970-01-01
        • 2019-08-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-03-28
        • 1970-01-01
        • 2018-03-08
        相关资源
        最近更新 更多