简体   繁体   English

req.user是未定义节点+快递+护照+猫鼬

[英]req.user is undefined node + express + passport + mongoose

when i use 当我使用

console.log(req.session);

i have message 我有消息

Session {cookie:{ path: '/',_expires: null,originalMaxAge: null,httpOnly:true },passport: { user: 5b427a2d117d7c3f6087db8a } }

but using 但是使用

console.log(req.user);

give me undefined 给我undefined

const express = require('express');
const passport = require('passport');
const session = require('express-session');
const bodyParser = require('body-parser');
const cors = require('cors');
const morgan = require('morgan');
const jwt = require('jsonwebtoken');
var mongoose = require('mongoose');
var MongoStore = require('connect-mongo')(session);

mongoose.connect('mongodb://localhost:27017/posts');
var db = mongoose.connection;
db.on("error", console.error.bind(console, "connection error"));
db.once("open", function(callback){
    console.log("Connection Succeeded");
});

var User = require("../models/user");
var Post = require("../models/post");
var Girl = require("../models/girl");
//load passport strategies

require('../config/passport/passport.js')(passport);

const app = express();
app.use(morgan('combined'));
app.use(bodyParser.json());
app.use(cors());

// For Passport
app.use(session({
    secret: 'keyboard cat',
    resave: true,
    saveUninitialized: true,
    store: new MongoStore({
        mongooseConnection: db
    })
}));


app.use(passport.initialize());
app.use(passport.session());

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

passport.deserializeUser(function(id, done) {
    User.findById(id, function(err, user) {
        done(err, user);
    });
});

Authorization method: 授权方式:

 app.post('/signin', function(req, res) {
    User.findOne({
       username: req.body.username
    }, function(err, user) {
      if (err) throw err;

      if (!user) {
        res.status(401).send({success: false, msg: 'Authentication failed. User not found.'});
      } else {
        // check if password matches
        user.comparePassword(req.body.password, function (err, isMatch) {
          if (isMatch && !err) {
              // if user is found and password is right create a token
              var token = jwt.sign(user.toJSON(), 'nodeauthsecret');
              res.json({success: true, token: 'JWT ' + token});
          } else {
              res.status(401).send({success: false, msg: 'Authentication failed. Wrong password.'});
          }
       });
    }
});

Method where try to take user 尝试吸引用户的方法

    app.post('/add_girl', (req, res) => {
    var db = req.db;
    console.log("-------------");
    console.log(req.user);
    console.log("-------------");
    //var userId = req.userId;
    var name = "Asuna";
    var level = 1;
    var newGirl = new Girl({
        //userId: userId,
        name: name,
        level: level
    });

    newGirl.save(function (error) {
        if (error) {
            console.log(error);
        }
        res.send({
            success: true
        });
    });
});

Please help. 请帮忙。 How I understand user saved in sessions, but how I can take him i don't understand 我如何理解保存在会话中的用户,但是我不知道该如何接受他

Have you defined the passport session ? 您定义过护照会议了吗?

app.use(passport.initialize());
app.use(passport.session());

Edit : 编辑:

Take passport.initialize and passport.session above mongo session 在mongo会话之前进行passport.initialize和passport.session

Your code should look something like this 您的代码应如下所示

require('../config/passport/passport.js')(passport);

const app = express();
app.use(morgan('combined'));
app.use(bodyParser.json());
app.use(cors());

// For Passport
app.use(passport.initialize());
app.use(passport.session());


// Replacing your app.use(passport.session()); with the one you've written 
//      with all other options

app.use(session({
    secret: 'keyboard cat',
    resave: true,
    saveUninitialized: true,
    store: new MongoStore({
        mongooseConnection: db
    })
}));


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

passport.deserializeUser(function(id, done) {
    User.findById(id, function(err, user) {
        done(err, user);
    });
});

Currently you're writing app.use(passport.session()) twice. 当前,您正在编写app.use(passport.session())两次。

我需要的就是添加

app.post('/add_girl', passport.authenticate('jwt', { session: true}),(req, res) => {
  1. If you are using low version express session (< v1.5), you have to import cookieParser to use session middleware like this. 如果使用的是低版本Express会话(<v1.5),则必须导入cookieParser才能使用这样的会话中间件。

     var express = require('express'); var cookieParser = require('cookie-parser'); var session = require('express-session'); var app = express(); app.use(cookieParser()) // before use session middleware app.use(session({secret: 'your secret'})); 
  2. And ordering of middlewares can be a problem. 中间件的订购可能是个问题。

  3. If you are using a HTTP connection, you have to remove the secure option like below. 如果您使用的是HTTP连接,则必须删除安全选项,如下所示。

      app.use(session({ secret: 'your secret', resave: false, saveUninitialized: true, // cookie: { secure: true } // remove this line if you are using a HTTP connection })) 

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM