2016-09-26 3 views
1

코드에 이상한 버그 또는 오류가 발생했습니다. 노드 서버에 인증 API를 설정했습니다. 내 미들웨어로 passportjs를 사용하고 내 전략으로 passport-jwt를 사용합니다.토큰에서 잘못된 사용자를 추출하는 노드 passport-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); 
      } 
     }); 
    })); 
}; 

과 같습니다

여권 상관없이 토큰 내가에서 제공 무엇을, 동일한 사용자마다 함께 req.user을 설정하지 않는 이유는
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 
}); 

승인 헤더? 감사

답변

1

가 해결, 이 라인은 발생 문제 :

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

모두 ID가 _ID한다 :

1

@BlueBallPanda, 내가 좋아하는 것 passport.js JWT 인증 전략 귀하의 질문에 대답하기 JWT_PAYLOAD의 구조를 표시하려면 다음과 같이 입력하십시오.

... 
passport.use(new JwtStrategy(opts, function(jwt_payload, done) { 
... 
})); 
01251641 , JWT 검사에 DB에서 추출하기 위해

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 } 

따라서 사용자 ID를 잡기 위해 여기 아래 참조 예를 들어

이 JWT_PAYLOAD 개체의 출력, 당신은 실제로 쉽게 혼동 할 수 구조를 볼 수 있습니다 그냥처럼 참조 :이 버그 상황 당신을 지 웁니다

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

희망 :

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

또는 그런

경험했다.

+0

고마워, 정말 버그가 아니었다. 나는 몽구스가 'id'대신 '_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는 데이터 사용자가 있습니다.

관련 문제