Я использую express js
в качестве базового фреймворка, в настоящее время работаю над модулем аутентификации при входе в систему, используя Passport-JWT ,
Я хочу использовать промежуточное ПО аутентификации на частных маршрутах.
Я не хочу писать passport.authenticate('jwt', {session: false}
на каждом маршруте, вместо этого я хочу создать одну функцию и использовать ее при каждом запросе, например
router.get('/current',isAuthenticated,controllers.auth.user);
аутентификация входа в систему работает правильно, но после этого, когда я получаю доступ к частному маршруту, она всегда выдает "Unauthorized."
Я искал столько же вопросов, но ни один из них не работает для меня, поэтому я снова задаю этот вопрос
когда пользователь успешно выполнил вход в систему, следующий токен был сохранен в localstorage.
Когда я пытался из Почтальона отдыхать клиент
- выдает несанкционированный при использовании
passport.authenticate('jwt', {session: false}
- отображается ошибка {name: 'JsonWebTokenError', сообщение: 'недопустимая подпись'} промежуточное ПО для паспорта при использовании isAuthenticate
Я использую эту версию пакета:
"passport": "^0.4.0",
"passport-jwt": "^4.0.0",
"jsonwebtoken": "^8.3.0",
Вот мои помощники / passport.js
const options = {};
options.jwtFromRequest = ExtractJwt.fromAuthHeaderAsBearerToken();
options.secretOrKey = 'qwer123poiuasdf234092482094';
module.exports = passport => {
passport.use(
new JwtStrategy(options, (jwt_payload, done) => {
User.findById(jwt_payload._id)
.then(user => {
if (user) {
return done(null, user);
}
return done(null, false);
})
.catch(err => {
console.log(err);
return done(err, false);
});
})
);
};
Вот мой server.js
global.express = require('express');
global.app = express();
global.passport = require('passport');
global.jwt = require('jsonwebtoken');
global.JwtStrategy = require('passport-jwt').Strategy;
global.ExtractJwt = require('passport-jwt').ExtractJwt;
global.logger = require('morgan');
global.Validator = require('validator');
global.bcrypt = require('bcrypt-nodejs');
global.crypto = require('crypto');
global.bodyParser = require('body-parser');
global.cookieParser = require('cookie-parser');
global.requireTree = require('require-tree');
global.mongoose = require('mongoose');
global.autoIncrement=require('mongoose-auto-increment');
mongoose.Promise = Promise;
mongoose.set('useCreateIndex', true);
var mongooseOptions = { useNewUrlParser: true }
global.Schema = mongoose.Schema;
autoIncrement.initialize(mongoose);
global.rootdir = __dirname;
global.ejs=require('ejs');
app.set('view engine', 'ejs')
app.set('views', __dirname + '/views')
global.configuration = requireTree(rootdir + '/configuration')
global.helpers = requireTree(rootdir + '/helpers')
require(rootdir+'/helpers/passport')(passport)
global.validation = requireTree(rootdir + '/validation')
mongoose.connect(configuration.config.MONGODB_URI, mongooseOptions, function(err) {
if (err) {
console.error('System could not connect to mongo server.')
console.log(err)
process.exit()
} else {
console.log('System connected to mongo server.')
}
});
app.use(logger('dev'));
app.use(passport.initialize())
app.use(express.static(__dirname + '/public'));
app.use('/public', express.static(__dirname + '/public'));
app.use(cookieParser());
app.use(bodyParser.urlencoded({
extended: true,
limit: '50mb',
parameterLimit: 100000
}))
app.use(bodyParser.json({
limit: '50mb',
parameterLimit: 100000
}))
app.use(function(req, res, next) {
res.header("Access-Control-Allow-Origin", "*");
res.header("Access-Control-Request-Headers", "*");
res.header('Access-Control-Allow-Methods', 'GET, POST, DELETE, OPTIONS');
res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept, Authorization");
res.header("Access-Control-Allow-Credentials", "true");
next();
});
// this function i want to use as middleware on private routes
global.isAuthenticated=function(req, res, next) {
if (req.headers.authorization) {
passport.authenticate('jwt', {session: false}, function (err, user, info) {
console.log('errr==',err);
console.log('user==',user);
console.log('info==',info);
if ((!err || !info) && user) {
req.user = user;
return next();
}
res.status(401).json({status:'error',isAuthenticated: false, message: "Unauthorized"});
})(req, res, next);
} else {
res.status(401).json({status:'error',isAuthenticated: false, message: "Unauthorized"});
}
}
app.use('/api/auth',routes.api.auth);
var port = process.env.PORT || 8888;
app.listen(port);
здесь routs / api / auth.js
const router=express.Router();
router.get('/current',isAuthenticated,(req,res)=>{
res.json({
user:req.user
});
});
module.exports =router
пожалуйста, помогите мне решить эту проблему