Я работаю над приложением с внешним интерфейсом 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);