2016-09-26 3 views
1

Я испытываю странную ошибку или ошибку в своем коде. Я установил auth api на сервере узла, используя паспортные данные как мое промежуточное программное обеспечение и паспорт-jwt в качестве своей стратегии.Узел паспорт-jwt извлечения неправильного пользователя из токена

Моя установка паспорта выглядит следующим образом

//add jwt strategy to passport 
var JwtStrategy = require('passport-jwt').Strategy; 
var ExtractJwt = require('passport-jwt').ExtractJwt; 

var User = require('../models/user'); 
var configDB = require('../config/database'); 

module.exports = function(passport) { 
    var opts = {}; 
    opts.secretOrKey = configDB.secret; 
    opts.jwtFromRequest = ExtractJwt.fromAuthHeader(); 
    passport.use(new JwtStrategy(opts, function(jwt_payload, done) { 
     //find user with give jwt payload id 
     User.findOne({ 
      id: jwt_payload.id 
     }, function(err, user) { 
      if(err) { 
       return done(err, false); 
      } 
      if(user) { 
       done(null, user); 
      } else { 
       done(null, false); 
      } 
     }); 
    })); 
}; 

тогда, мой защищенный маршрут:

apiRoutes.get('/account', passport.authenticate('jwt', {session: false}), function(req, res) { 

    console.log(req.user.nickname); //returns user1 no matter what JWT I supply with request 
    console.log(jwt.decode(getToken(req.headers), configDB.secret)).nickname; //decodes user from token correctly 
    ..do other stuff 
}); 

Почему же паспорт устанавливает req.user с тем же пользователем каждый раз, независимо от того, что Токен я поставляю в Заголовок авторизации? Благодаря

ответ

1

решаемые, эта линия вызвала проблема:

User.findOne({ 
    id: jwt_payload.id 
... 

оба Идентификаторы должны быть _ID :)

1

@BlueBallPanda, чтобы ответить на ваш вопрос с passport.js JWT стратегии аутентификации Я хотел бы для отображения структуры JWT_PAYLOAD объект, который вы используете в строке:

... 
passport.use(new JwtStrategy(opts, function(jwt_payload, done) { 
... 
})); 

В ссылочном примере здесь ниже выводится из объекта JWT_PAYLOAD, вы можете увидеть ее структуру, которая может на самом деле легко спутать:

JWT_PAYLOAD: { '$__': 
    { strictMode: true, 
    selected: {}, 
    getters: {}, 
    _id: '7987930e36333b5634bb5577', 
    wasPopulated: false, 
    activePaths: { paths: [Object], states: [Object], stateNames: [Array] }, 
    pathsToScopes: {}, 
    emitter: { domain: null, _events: {}, _eventsCount: 0, _maxListeners: 0 } }, 
    isNew: false, 
    _doc: 
    { __v: 0, 
    password: '$2a$10$12GRB1vGbkl3XfGY.r81SuASyK/cfsp85fk92B3N6eSRO6GVy1TSW', 
    email: '[email protected]', 
    _id: '7987930e36333b5634bb5577' }, 
    '$init': true, 
    iat: 1502061031, 
    exp: 1502071111 } 

Так, чтобы захватить идентификатор пользователя для того, чтобы извлечь из БД на проверку JWT, просто ссылаться на него так:

User.findOne({ 
     id: jwt_payload.$__._id 
    } 

или как то:

User.findOne({ 
     id: jwt_payload.$__._doc._id 
    } 

Надеется, что это очищает ситуацию багги ты по испытали.

+0

Спасибо, не было на самом деле ошибкой, я просто не понял, что мангуста генерирует идентификаторы модели как «_id», а не «id» ... Но в любом случае некоторые действительно полезные данные в полезной нагрузке проведут проверку в следующий раз Я работаю с ним спасибо :) – BlueBallPanda

0

я решить эту проблему с помощью этой функции:

var JwtStrategy = require(‘passport-jwt’).Strategy, 
ExtractJwt = require(‘passport-jwt’).ExtractJwt; 

// load up the user model 
var User = require(‘../models/user’); 
var config = require(‘../config/database’); // get db config file 

module.exports = function(passport) { 
    var opts = {}; 
    opts.jwtFromRequest = ExtractJwt.fromAuthHeader(); 
    opts.secretOrKey = config.secret; 
    passport.use(new JwtStrategy(opts, function(jwt_payload, done) { 
     done(null, jwt_payload._doc); 
    })); 
}; 

_doc имеют пользовательские данные.

Смежные вопросы