Node.js 使用ExpressJWT,为什么我的授权头在';很明显在那里

Node.js 使用ExpressJWT,为什么我的授权头在';很明显在那里,node.js,authentication,token,express-jwt,Node.js,Authentication,Token,Express Jwt,我正在使用expressjwt和jsonwebtoken 尝试使用jsonwebtoken.verify()时,出现以下错误: Error: Invalid token: no header in signature 'Bearer eyJ0eXAiOi...reallylongtoken... ... more ... code: 'MISSING_HEADER' 我可以看到req.headers.authorization令牌存在,因为我正在注销它。所以我不明白为什么标题会丢失,如果它清楚

我正在使用expressjwt和jsonwebtoken

尝试使用jsonwebtoken.verify()时,出现以下错误:

Error: Invalid token: no header in signature 'Bearer eyJ0eXAiOi...reallylongtoken...
... more ...
code: 'MISSING_HEADER'
我可以看到req.headers.authorization令牌存在,因为我正在注销它。所以我不明白为什么标题会丢失,如果它清楚地在那里的话

谢谢你的帮助。 要点如下:

下面是req.headers.authorization的console.log输出

Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJfaWQiOiI1NDhhMGFkODcwZWZjZmMwM2EwMDAwMDEiLCJjcmVhdGVkQXQiOiIyMDE0LTEyLTExVDIxOjIxOjI4LjI0M1oiLCJmaXJzdE5hbWUiOiIiLCJsYXN0TmFtZSI6IiIsInVzZXJuYW1lIjoicnlhbm9yZSIsInBhc3N3b3JkIjoiJDJhJDEwJFM0YjcyVzIyQS9ubDJxZXV0WUxsUk9SNWhIblhvTGxkT09ud096OTFVNzBvSDVIQXRGZFhTIiwiZW1haWwiOiIiLCJfX3YiOjB9.fiHZ1J7cLXtgurTvqGVP2RcJqpju1zNmXBETWqYKXko

看起来问题在于你的签名无效

我通过获取您的授权头输出,并将其复制并粘贴到JWT调试器中进行了测试:

正如您在下面的屏幕截图中所看到的,存在一些错误

最好的


我不得不拒绝@rdegge的回答,因为我有点仓促行事。发现调试器非常有帮助,但对解决我的问题几乎没有实际帮助

答案其实很简单。我在发送整个授权头的时候,需要将其“承载者”部分拆分。我是从你那里得到这个主意的。移除“承载器”部件后,确认无问题

这是更新后的函数,如果它对其他人有帮助的话

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

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

如果在密码字段中将“selected:false”添加到mongoose用户模式中,则可以避免返回它。如果这样做,请在查找登录方法中使用“+密码”符号(如中所示):

User.findOne({email:req.body.email},“+password”,函数(err,User){
....  } 

希望这有帮助!

您能更新您的问题并直接包含
req.headers.authorization
的console.log输出吗?问题很可能是其中的某些部分工作不正常。如果我们直接看到,我们可以更轻松地进行调试=)谢谢您的快速响应,我添加了输出。谢谢,我不知道该工具。我是jwt的新手。干杯没问题!你刚开始的时候会很困惑!祝你的冒险好运。它是无效的,因为你没有进入这个秘密。。。虽然这个工具很有用,但这个答案是错误的。酷!我从没见过。是的,这真的应该是一个评论,但谢谢。我有同样的问题,这似乎对我有用,但似乎很奇怪。如果我们只是在接收端忽略它,为什么要在请求中设置
Bearer
?@MichaelLynch,当我这样做的时候,我遵循了这个教程和那个教程,我从来没有停下来问过这个问题。在我的情况下,我是滚动我自己的身份验证,所以我想不出任何理由它是必要的。这就是说,这是Oauth标准中使用的一种约定,许多框架因此遵循这种约定。
User.findOne({ email: req.body.email }, '+password', function(err, user) {
.... <<enter code to check if credentials are correct>> }