2017-01-16 70 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

相关问题