使用express-jwt时,为什么我的授权标题在显式存在的时候丢失了

我正在使用express-jwt和jsonwebtoken。

当我尝试使用jsonwebtoken.verify(),我得到这个错误:

Error: Invalid token: no header in signature 'Bearer eyJ0eXAiOi...reallylongtoken... ... more ... code: 'MISSING_HEADER' 

我可以看到req.headers.authorization标记存在,因为我将其注销。 所以我不明白为什么标题丢失,如果它清楚地存在。

任何帮助赞赏。 这里的要点是:
https://gist.github.com/ryanore/914362881d2d9f0878f2

这是req.headers.authorization的console.log输出

 Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJfaWQiOiI1NDhhMGFkODcwZWZjZmMwM2EwMDAwMDEiLCJjcmVhdGVkQXQiOiIyMDE0LTEyLTExVDIxOjIxOjI4LjI0M1oiLCJmaXJzdE5hbWUiOiIiLCJsYXN0TmFtZSI6IiIsInVzZXJuYW1lIjoicnlhbm9yZSIsInBhc3N3b3JkIjoiJDJhJDEwJFM0YjcyVzIyQS9ubDJxZXV0WUxsUk9SNWhIblhvTGxkT09ud096OTFVNzBvSDVIQXRGZFhTIiwiZW1haWwiOiIiLCJfX3YiOjB9.fiHZ1J7cLXtgurTvqGVP2RcJqpju1zNmXBETWqYKXko 

我不得不接受@rdegges的答案,因为我跳了一下枪。 发现debugging器是非常有帮助的,但是在解决我的问题方面没有什么实际的帮助。

答案其实很简单。 当我需要拆分“承载者”部分时,我发送了整个授权标题。 我从这个博客得到了这个想法。 删除“持证人”部分后,validation罚款。

这是更新的function,如果有帮助的人。

 exports.verify = function(req, res) { var token = null; var bits = req.headers.authorization.split(' '); if (bits.length == 2) { var scheme = bits[0]; var credentials = bits[1]; if (/^Bearer$/i.test(scheme)) { token = credentials; jwt.verify(token, config.secret, function(err, decoded){ if(err) sendStatus(res, 401); }); } } else{ sendStatus(res, 401); } }; 

看起来问题是你的签名是无效的。

我通过获取Authorization头输出来testing它,并将其复制粘贴到JWTdebugging器中: http : //jwt.io

正如你在下面的截图中看到的,有一些错误。

最好!

智威汤逊调试

我没有足够的声望来评论,但是在@rdegges答案的jwt的屏幕截图中,看起来您正在包含密码和用户详细信息。 您不应该在jwt中发送密码(即使不需要散列)或任何敏感数据。

如果您在密码字段中将“selected:false”添加到mongoose用户模式中,您可以避免它返回。 如果你这样做,在find方法中使用“+密码”符号进行login(如in):

 User.findOne({ email: req.body.email }, '+password', function(err, user) { .... <<enter code to check if credentials are correct>> } 

希望这可以帮助!