2017-01-16 58 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; 

所以我知道它是正確的查詢用戶ID和尋找它,但它只是在這一點上掛斷,而不是服務我回應。

不確定是什麼問題,所以任何和所有的建議,歡迎和讚賞。謝謝!

回答

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); } 
    }); 
}); 

... 

這解決了我的問題,並返回我的迴應。