Игра с паспортно-JWT, я уже создание основной HTTP-конечная точка, чтобы получить мой маркер (используя паспорт HTTP)паспорт JWT проверить обратный вызов не запускается
Он работает.
Я хочу, чтобы определить свой собственный успех | обратные вызовы ошибок с использованием шаблона, описанный в passport documentation:
app.get('/login', function(req, res, next) {
passport.authenticate('local', function(err, user, info) {
if (err) { return next(err); }
if (!user) { return res.redirect('/login'); }
req.logIn(user, function(err) {
if (err) { return next(err); }
return res.redirect('/users/' + user.username);
});
})(req, res, next);
});
Теперь я хочу, чтобы получить паспорт-JWT работы в качестве промежуточного слоя для некоторых из моих маршрутов я не придется неоднократно называть паспорт.authenticate в них. Так я создал этот модуль:
var logger = require('../util/logger');
var cfg = require('../cfg');
var router = require('express').Router();
var passport = require('passport');
var JwtStrategy = require('passport-jwt').Strategy;
var User = require('../model/user');
var opts = {};
opts.jwtFromRequest = function(req) {
var token = null;
if (req && req.cookies) {
token = req.cookies.jwt;
}
logger.info('jwtFromRequest::token: ' + token); // shown: 'JWT <token_string>''
return token;
};
opts.secretOrKey = cfg.secret;
passport.use(new JwtStrategy(opts, function(jwt_payload, done) {
logger.info('verify::authenticating request using jwtStrategy'); // not shown
User.findOne({
username: jwt_payload.username
}, function(err, user) {
if (err) {
logger.info('verify::error: ' + err);
return done(err, false);
}
if (user) {
logger.info('verify::user: ' + user);
return done(null, user);
} else {
logger.info('verify: user not found');
return done(null, false);
}
});
}));
var Filter = function(req, res, next) {
passport.authenticate('jwt', {
session: false
}, function(err, user) {
if (err) {
logger.error(err);
return next(err);
}
if (!user) {
var payload = {}
logger.info("filter::user " + user); // shows false
if (req.params && req.params.resource) {
payload.resource = req.params.resource
}
payload.message = 'authentication failure'
return res.status(401).send(payload); // 401 is sent
}
next();
})(req, res, next);
}
module.exports = Filter;
И так идет мой маршрут:
router.get('/', filter, function(req, res, next) {
// doing some business
});
Несмотря на то, что я получаю жетон, я не могу получить аутентификации работает (аутентификации возвращает 401), и я не получаю ни одну из моих инструкций по регистрации в прилагаемой функции проверки).
Согласно passport-jwt source code, я чувствую себя не знающим о том, что пользовательская функция jwtFromRequest beeing называется, а функция проверки, очевидно, не является.
Почему эта функция не вызвана?