2016-08-10 45 views
0

我用护照JWT战略快递项目认证的路线上,passport.authenticate不执行

这里是此目录中MT的护照,智威汤逊配置:/config/passport.js

var JwtStrategy = require('passport-jwt') 
 
\t .Strategy, 
 
\t ExtractJwt = require('passport-jwt') 
 
\t .ExtractJwt; 
 

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

 
module.exports = function(passport) { 
 
    console.log("here: passport-jwt"); 
 
\t var opts = {} 
 
\t opts.jwtFromRequest = ExtractJwt.fromAuthHeader(); 
 
\t opts.secretOrKey = config.secret; 
 
\t passport.use(new JwtStrategy(opts, function(jwt_payload, done) { 
 
\t \t User.findOne({ 
 
\t \t \t id: jwt_payload.id 
 
\t \t }, function(err, user) { 
 
\t \t \t if (err) { 
 
\t \t \t \t return done(err, false); 
 
\t \t \t } 
 
\t \t \t if (user) { 
 
\t \t \t \t done(null, user); 
 
\t \t \t } else { 
 
\t \t \t \t done(null, false); 
 
\t \t \t } 
 
\t \t }); 
 
\t })); 
 
};

,并在/routes/account.js目录帐户路线我这样调用它:

var passport = require('passport'); 
require(__dirname + '/../config/passport')(passport); 

router.post('/', passport.authenticate('jwt', { 
session: false 
}), function(req, res) { ... } 

但问题是身份验证的护照功能没有执行。和“这里:passport-jwt”没有显示。

问题在哪里?加上几行后

回答

0

都在app.js首先,必须航线这样的声明

var passport = require('passport'); 
app.use(passport.initialize()); 

你应该添加这些行:

var account = require(__dirname + '/routes/account')(app, express, passport); 
app.use('/account', account); 

,在该路由本身:

module.exports = function(app, express, passport) { 

    var router = express.Router(); 

    router.post('/', function(req, res) { 

     passport.authenticate('jwt', function(err, user) { 
     if (err) { 
       res.sendStatus(406); 
      } else { 
       if (!user) { 
        res.sendStatus(400); 
       } else {...} 
      } 
     }); 
     } 

    } 
} 

我的错误是,放在console.log("here: passport-jwt");模块的第一线,但实际上passport.use(..)部分执行每一次!

和最后一件事是在护照配置的findOne部分,passport.use(...)一部分,当你想使用MongoDB中本地ID,您应该查询_id而不是id

所以,正确的代码是:

User.findOne({ 
      _id: jwt_payload.id 
     }, function(err, user) { 
       ... 
      }); 
1

也许你可以试试这个:

router.get('/', function(req, res) { 
    passport.authenticate('jwt', 
     { 
     session: false 
     }); 
}); 
+0

我试过,但问题依然存在。 和路由的方法是后(可能是有所作为)。 – Pourya8386