2017-01-16 63 views
0

我已經在Stackoverflow上檢查了多個答案,並且還通過了文檔,但我仍然無法找出可能是什麼問題。在我的應用程序中,我使用SequelizeJS訪問我的mySQL數據庫,現在我試圖使用JWT策略來使用PassportJS保護我的REST API端點。當使用PassportJS,SequelizeJS和JWT令牌時,req.user是未定義的

./app.js

// ... 
// passport 
app.use(passport.initialize()); 
require('./config/passport')(passport); 
// ... 

./config/passport.js

var passport  = require('passport'); 
var passportJwt = require('passport-jwt'); 
var models  = require('../models'); 
var config  = require('./config'); 

var ExtractJwt = passportJwt.ExtractJwt; 
var Strategy = passportJwt.Strategy; 

module.exports = function(passport) { 
    var params = { 
     secretOrKey: config.jwt.secret, 
     jwtFromRequest: ExtractJwt.fromAuthHeader() 
    }; 

    passport.use(new Strategy(params, function(jwt_payload, done) { 
     models.User.findOne({ 
      where: { 
       id: jwt_payload.id 
      } 
     }).then(
      function(user) { 
       if (user) { 
        done(null, user); 
       } else { 
        done(null, false); 
       } 
      }, 
      function(err) { 
       return done(err, false); 
      } 
     ); 
    })); 
}; 

我想從這個簡單的路線的要求,得到了用戶的實體:

var router = express.Router(); 
// ... 
router.route('/user/me', passport.authenticate('jwt', { session: false })) 
    .get(function(req, res) { 
     console.log(req.user); 
     res.json(req.user); 
    }); 

我已經創建了另一條路線,它根據提供的用戶名和密碼返回一個JWT令牌。當我打電話/user/me端點我附上JWT令牌到頁眉,例如:

Authorization: JWT eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI6MX0.M9z3iWNdjAu4THyCYp3Oi3GOWfRJNCYNUcXOw1Gd1Mo 

所以,我的問題是,當我致電/user/me端點一個道理,req.user將是不確定的,我不明白它是什麼原因。

非常感謝您的幫助!

+0

不便只是爲了確保,你檢查你的模型的搜索查詢的回報是什麼?我的意思是用戶在.then()函數 –

+0

我不知道如何檢查策略中的查詢,但我用硬編碼{id:1}過濾器執行,它工作正常。它返回一個JSON對象。 – peetya

回答

2

您的路由定義似乎是錯誤的:router.route在第二個參數中不接受中間件,因此認證根本不會發生。

應該是這樣

var router = express.Router(); 
// ... 
router.route('/user/me') 
    .all(passport.authenticate('jwt', { session: false })) 
    .get(function(req, res) { 
     console.log(req.user); 
     res.json(req.user); 
    }); 
+0

非常感謝你,對我感到羞恥:) – peetya