2016-07-08 2 views
0

Игра с паспортно-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 называется, а функция проверки, очевидно, не является.

Почему эта функция не вызвана?

ответ

0

Моя ошибка. Проблема заключалась в том, что я добавлял «JWT» к своему токену, как показано в this tutorial, который, похоже, не требуется здесь.