NodeJS: Паспорт JWT (v4.0.0) не смог аутентифицировать пользователя из POSTMAN Rest Client, всегда возвращать Unauthorized - PullRequest
0 голосов
/ 29 октября 2018

Я использую express js в качестве базового фреймворка, в настоящее время работаю над модулем аутентификации при входе в систему, используя Passport-JWT ,

Я хочу использовать промежуточное ПО аутентификации на частных маршрутах.

Я не хочу писать passport.authenticate('jwt', {session: false} на каждом маршруте, вместо этого я хочу создать одну функцию и использовать ее при каждом запросе, например

router.get('/current',isAuthenticated,controllers.auth.user);

аутентификация входа в систему работает правильно, но после этого, когда я получаю доступ к частному маршруту, она всегда выдает "Unauthorized."

Я искал столько же вопросов, но ни один из них не работает для меня, поэтому я снова задаю этот вопрос

когда пользователь успешно выполнил вход в систему, следующий токен был сохранен в localstorage.

enter image description here

Когда я пытался из Почтальона отдыхать клиент

  • выдает несанкционированный при использовании passport.authenticate('jwt', {session: false}

enter image description here

  • отображается ошибка {name: 'JsonWebTokenError', сообщение: 'недопустимая подпись'} промежуточное ПО для паспорта при использовании isAuthenticate

enter image description here

Я использую эту версию пакета:

"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

пожалуйста, помогите мне решить эту проблему

1 Ответ

0 голосов
/ 29 октября 2018

Прежде всего, ошибка «Не удалось получить ответ» связана не с ошибкой аутентификации, а с тем, что сервер не работает или отсутствует маршрут API.

Во-вторых, убедитесь, что вы используете настроенный токен, чтобы Bearer в противном случае отправлял только токен (без Bearer).

Я думаю, что в вашем случае вы не отправляете правильный токен (попробуйте удалить Носитель) от клиента.

...