簡體   English   中英

req.user是未定義節點+快遞+護照+貓鼬

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

當我使用

console.log(req.session);

我有消息

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

但是使用

console.log(req.user);

給我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);
    });
});

授權方式:

 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.'});
          }
       });
    }
});

嘗試吸引用戶的方法

    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
        });
    });
});

請幫忙。 我如何理解保存在會話中的用戶,但是我不知道該如何接受他

您定義過護照會議了嗎?

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

編輯:

在mongo會話之前進行passport.initialize和passport.session

您的代碼應如下所示

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);
    });
});

當前,您正在編寫app.use(passport.session())兩次。

我需要的就是添加

app.post('/add_girl', passport.authenticate('jwt', { session: true}),(req, res) => {
  1. 如果使用的是低版本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. 中間件的訂購可能是個問題。

  3. 如果您使用的是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