Express + Exp Router + PassportJS:用户未添加到Req

时间:2019-07-02 01:20:11

标签: mongoose passport.js express-router

我正在使用带有Axios前端的VueJS和后端的Mongo,MongooseJS,Express,Express Router和PassportJS的应用程序。我已经能够使用passport-local-mongoose设置PassportJS登录名,并使我的初始登录工作正常。但是,随后的API调用(如下面的userRoutes.use('/api/',之一)上没有user,并且req.isAuthenticated()始终返回false。

我想念什么?

(我在SO上看到了其他类似的问题,但是没有使用此路由器设置,有些相似的问题也无法解决问题。)

ServerJS

const express = require('express');
const server = express();
const bodyParser = require('body-parser');
const PORT = 4000;
const cors = require('cors');
const mongoose = require('mongoose');
const passport = require('passport');
const config = require('./DB.js');
const router = express.Router();
const session = require('express-session');

const User = require('./user.model');

mongoose.Promise = global.Promise;
mongoose.connect(config.DB, { useNewUrlParser: true }).then(
  () => {console.log('Database is connected') },
  err => { console.log('Can not connect to the database'+ err)}
);

server.use(cors({origin:true,credentials:true}));
server.use(bodyParser.json());
server.use(bodyParser.urlencoded({extended: true}));
server.use(session({
    secret: 'not telling',
    resave: false,
    saveUninitialized: true
}));

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

passport.use(User.createStrategy());

passport.serializeUser(User.serializeUser());
passport.deserializeUser(User.deserializeUser());

const msgRoute = require('./msg.route');
const userRoute = require('./user.route')(passport);

server.use('/msgs', letterRoute);
server.use('/users', userRoute);

server.listen(PORT, function(){
  console.log('Server is running on Port:',PORT);
});

user.route.js

module.exports = function(passport){
    const express = require('express');
    const userRoutes = express.Router();

    // Require User model in our routes module
    let User = require('./user.model');

    userRoutes.use(function(req, res, next) {
        console.log(req.session); // only has cookie in it
        console.log(req.user); // is undefined
        console.log(req.isAuthenticated()); // is false
        console.log(req.passport); // is undefined
        next();
    });


    // Use Passport to Authenticate as middleware
    userRoutes.use('/api/login', passport.authenticate('local'), (req, res) => {
        delete req.user.salt;
        delete req.user.hash;
        res.json(req.user);
    });

    userRoutes.route('/api/add').post((req, res) => {
        User.register(new User({ username : req.body.email, name: req.body.name }), req.body.password, function(err, user) {
            if (err) res.status(401).json({err});

            req.login(user, err => {
                if (err) { return res.status(401).json(err); }

                delete user.salt;
                delete user.hash;
                res.json(user);
            });
        });
    });

    // Defined get data(index or listing) route
    userRoutes.use('/api/', util.restrict, (req, res) => {
        User.find(function(err, users){
            if(err) return res.json(err);

            res.json(users);
        });
    });

    return  userRoutes;
}

user.model.js

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

// Define collection and schema for User
let User = new Schema({
    name: String,
    email: String,
    hash: String,
    salt: String,
    friends: [Schema.Types.ObjectId]
},{
    collection: 'users'
})

User.plugin(passportLocalMongoose);

module.exports = mongoose.model('User', User);

0 个答案:

没有答案