Express + Exp Router + PassportJS: пользователь не добавлен в Req - PullRequest
0 голосов
/ 02 июля 2019

Я работаю над приложением с внешним интерфейсом VueJS w Axios и Mongo, MongooseJS, Express, Express Router и PassportJS на внутреннем сервере. Я смог настроить логин PassportJS с помощью passport-local-mongoose и заставить мой первоначальный логин работать нормально. Тем не менее, последующие вызовы 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);
...