2016-09-26 75 views
1

我遇到了一個奇怪的錯誤或代碼錯誤。 我已經在節點服務器上設置了auth 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); 
      } 
     }); 
    })); 
}; 

然後,我的保護途徑:

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應該_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 } 

所以,以便從數據庫中提取的智威湯遜檢查搶奪用戶ID, 剛纔提到它像:

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

或類似的:

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

希望這將清除出你的車的情況經歷過。

+0

謝謝,這不是一個真正的bug,我只是沒有意識到貓鼬生成的模型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有數據的用戶。