【问题标题】:Getting "error": "Unknown authentication strategy \"jwt\""得到“错误”:“未知的身份验证策略\”jwt\“”
【发布时间】:2017-04-01 21:02:31
【问题描述】:

我正在使用 Express、Mongoose、Passport 和 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;

【问题讨论】:

    标签: express jwt passport.js


    【解决方案1】:

    您忘记在应用程序中包含您自己的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);
    ...
    

    【讨论】:

    • 感谢您的建议,但没有奏效。我在 var passport = require('passport'); 下方添加了 require('./passport');
    • 我已经在 Plunker 上设置了我所有的代码块,以便您有更好的视野,如果您有机会的话:plnkr.co/edit/ZNjQwcZ4rMymzBXNy5nX?p=catalogue
    • 仍然缺少 passport,因为我们正在谈论 github.com/jaredhanson/passport 。您应该要求来自护照模块的passport,而不是提供策略的passport.js
    • @cnak2 - 教程似乎还可以。您需要提供护照,然后将其传递给 config - require('./config/passport')(passport);
    • 感谢@KrzysztofSafjanowski 和@hjpotter92!成功了。
    【解决方案2】:

    如果您查看您的护照配置文件 (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
    

    希望对你有帮助

    【讨论】:

      【解决方案3】:

      只是碰巧有人遇到了同样的问题,但最佳答案没有解决。

      我的问题最终是意外地将节点模块移动到另一个目录,然后当然运行 npm install 来修复模块导入错误。我最终得到了两个 node_modules 目录,虽然服务器启动正常,但在调用它时通行证出错。

      我最终找到了错误并删除了第二个 node_modules 目录,并且未解决未知身份验证策略“jwt”。

      【讨论】:

        猜你喜欢
        • 2019-04-30
        • 2022-01-10
        • 2015-04-03
        • 2022-01-11
        • 2018-12-01
        • 2014-02-22
        • 2021-12-15
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多