2017-01-16 2 views
0

Я использую Passport для аутентификации, в частности, с помощью стратегии JWT. Однако я могу создать новый токен, когда пользователь создан, когда я использую этот токен в заголовке запроса маршрута, который требует аутентификации, мой запрос просто зависает. Я использую Postman для тестирования этих запросов POST/GET.Passport.authenticate не отправляет ответ

Вот моя первоначальная конфигурация для подписавшись пользователя:

const User = require('../db/models/User'); 
const jwt = require('jsonwebtoken'); 

function userToken(user) { 
    return jwt.sign({ 
    id: user.id, 
    }, process.env.JWT_SECRET); 
} 

exports.signup = function(req, res, next) { 
    const email = req.body.email.toLowerCase(); 
    const password = req.body.password.toLowerCase(); 

    User.findOne({ 
    where: { email }, 
    }).then(function(user) { 
    if (!user) { 
     User.create({ 
     email, 
     password, 
     }) 
     .then(function(user) { 
     return res.send({ token: userToken(user) }); 
     }); 
    } 
    if (user) { 
     return res.send({ message: 'That user is in use' }); 
    } 
    }); 
}; 

Вот моя конфигурация паспорта:

const passport = require('passport'); 
const JwtStrategy = require('passport-jwt').Strategy; 
const ExtractJwt = require('passport-jwt').ExtractJwt; 
const User = require('../db/models/User'); 

const jwtOptions = { 
    jwtFromRequest: ExtractJwt.fromHeader('authorization'), 
    secretOrKey: process.env.JWT_SECRET, 
}; 

const jwtLogin = new JwtStrategy(jwtOptions, function(payload, done) { 
    User.findOne({ 
    where: { id: payload.id }, 
    }, function(err, user) { 
    if (err) { return done(err, false); } 
    if (user) { return done(null, user); } 
    return done(null, false); 
    }); 
}); 

passport.use(jwtLogin); 

Вот что выглядит мой защищенный маршрут как:

const passport = require('passport'); 

const requireAuth = passport.authenticate('jwt', { session: false }); 

module.exports = function router(app) { 
    app.get('/', requireAuth, function(req, res) { 
    res.send({ 'hi': 'there' }); 
    }); 
}; 

Вот что я вижу в моем терминале:

Executing (default): SELECT "id", "username", "email", "password", "photo", "createdAt", "updatedAt" FROM "users" AS "user" WHERE "user"."id" = 15; 

Так что я знаю, что это правильно запрос для идентификатора пользователя и ищет его, однако, он просто вешает на данный момент, а не служить мне ответ.

Не уверен, в чем проблема, поэтому любые предложения приветствуются и оцениваются. Спасибо!

ответ

0

Понял, что так как я использую Sequelize, он обрабатывает ошибки с уловом, как так:

... 

const jwtLogin = new JwtStrategy(jwtOptions, function(payload, done) { 
    User.findOne({ 
    where: { id: payload.id } 
    }) 
    .then(user => { 
    if (user) { 
     done(null, user); 
    } else { 
     done(null, false); 
    } 
    }) 
    .catch(err => { 
    if (err) { return done(err, false); } 
    }); 
}); 

... 

Это решило мою проблему и возвращает свой ответ.