2016-11-18 84 views
0

我正在使用Express,Mongoose,Passport和JWT实施授权功能。获取“错误”:“未知的身份验证策略”jwt “”

我可以注册一个用户。我能够验证并生成JWT,我可以在JWT网站上解析JWT,但出于某种原因,我收到了未知的验证策略错误消息。

我有一个Plunker实例奠定了我所有的代码块在:

https://plnkr.co/edit/ZNjQwcZ4rMymzBXNy5nX?p=catalogue

这里是我的passport.js文件,其中包括我的策略:

var JwtStrategy = require('passport-jwt').Strategy; 

// 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.secretOrKey = config.secret; 
    passport.use(new JwtStrategy(opts, function(jwt_payload, done) { 
    User.findOne({id: jwt_payload.id}, function(err, user) { 
      if (err) { 
       return done(err, false); 
      } 
      if (user) { 
       done(null, user); 
      } else { 
       done(null, false); 
      } 
     }); 
    })); 
}; 

这里是我的authentication.js文件的样子:

var express = require('express'); 
var router = express.Router(); 
var jwt = require('jwt-simple'); 
var config = require('../config/database'); 

var User = require('../models/user'); 



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

    User.findOne({ 
    name: req.body.name 
    }, function(err, user) { 
    if (err) 
     res.send(err); 

    if (!user) { 
     res.send({success: false, msg: 'Authentication failed. User not found.'}); 
    } else { 
     // check if password matches 
     user.comparePassword(req.body.password, function (err, isMatch) { 
     if (isMatch && !err) { 
      // if user is found and password is right create a token 
      var token = jwt.encode(user, config.secret); 
      // return the information including token as JSON 
      res.json({success: true, token: 'JWT ' + token}); 
     } else { 
      res.send({success: false, msg: 'Authentication failed. Wrong password.'}); 
     } 
     }); 
    } 
    }); 
}); 


module.exports = router; 

这里是我打电话是产生错误的端点:

var express = require('express'); 
var router = express.Router(); 
var jwt = require('jwt-simple'); 
var config = require('../config/database'); 
var passport = require('passport'); 

var User = require('../models/user'); 

router.route('/') 

.get(passport.authenticate('jwt', { session: false}), function(req, res) { 
    var token = getToken(req.headers); 
    if (token) { 
    var decoded = jwt.decode(token, config.secret); 
    User.findOne({ 
     name: decoded.name 
    }, function(err, user) { 
     if (err) throw err; 

     if (!user) { 
      return res.status(403).send({success: false, msg: 'Authentication failed. User not found.'}); 
     } else { 
      res.json({success: true, msg: 'Welcome in the member area ' + user.name + '!'}); 
     } 
    }); 
    } else { 
    return res.status(403).send({success: false, msg: 'No token provided.'}); 
    } 
}); 

getToken = function (headers) { 
    if (headers && headers.authorization) { 
    var parted = headers.authorization.split(' '); 
    if (parted.length === 2) { 
     return parted[1]; 
    } else { 
     return null; 
    } 
    } else { 
    return null; 
    } 
}; 

module.exports = router; 

回答

3

你忘了,包括在应用自己的passport.js模块。这导致nodejs找不到最终导致您看到的错误的JWTStrategy的定义。

在您的端点文件中,只包含本地passport.js文件:

var express = require('express'); 
var router = express.Router(); 
var jwt = require('jwt-simple'); 
var config = require('../config/database'); 
var passport = require('passport'); 

require('./passport')(passport) // as strategy in ./passport.js needs passport object 

var User = require('../models/user'); 

router.route('/') 
.get(passport.authenticate('jwt', { session: false}), function(req, res) { 
    var token = getToken(req.headers); 
... 
+0

感谢您的建议,但没有奏效。我在var passport = require('passport')下面添加了require('./ passport'); – cnak2

+0

我有我所有的代码块设置Plunker给你一个更好的看法,如果你有机会:https://plnkr.co/edit/ZNjQwcZ4rMymzBXNy5nX?p=catalogue – cnak2

+0

仍然**护照**缺少,因为我们是谈论https://github.com/jaredhanson/passport。您应该要求护照模块的护照,而不是提供策略 –

0

如果你看一下你的护照配置文件(passport.js),你会看到

module.exports = function (passport) { 
    //bla bla bla 
} 

如您所见,需要passport instance

现在怎么样pass this instance到您的passport.js文件

简单

var passport = require('passport');// create a passport instance 
var myPassportService = require('../config/passport')(passport);// pass it into passport.js file 

希望这可以帮助你