得到“错误”:“未知的身份验证策略\”jwt\“”
Posted
技术标签:
【中文标题】得到“错误”:“未知的身份验证策略\\”jwt\\“”【英文标题】: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;
【问题讨论】:
【参考方案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”。
【讨论】:
以上是关于得到“错误”:“未知的身份验证策略\”jwt\“”的主要内容,如果未能解决你的问题,请参考以下文章