我在快递项目中使用Passport-jwt策略进行身份验证,
这是目录中的mt passport-jwt config:/config/passport.js
var JwtStrategy = require('passport-jwt')
.Strategy,
ExtractJwt = require('passport-jwt')
.ExtractJwt;
var User = require(__dirname + '/../models/user');
var config = require(__dirname+ '/database');
module.exports = function(passport) {
console.log("here: passport-jwt");
var opts = {}
opts.jwtFromRequest = ExtractJwt.fromAuthHeader();
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);
}
});
}));
};
并在/routes/account.js目录中的帐户路由中,我这样称呼它:
var passport = require('passport');
require(__dirname + '/../config/passport')(passport);
router.post('/', passport.authenticate('jwt', {
session: false
}), function(req, res) { ... }
但问题是身份验证的护照功能无法执行。并且“这里:护照-jwt”没有显示。
问题出在哪里?
答案 0 :(得分:1)
也许你可以试试这个:
router.get('/', function(req, res) {
passport.authenticate('jwt',
{
session: false
});
});
答案 1 :(得分: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
而不是{{1} }!
所以,正确的代码是:
id