1

我正在使用 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
4

3 回答 3

2

我不得不不接受@rdegges 的回答,因为我有点过激了。发现调试器非常有帮助,但对解决我的问题并没有什么实际帮助。

答案其实很简单。当我需要拆分其中的“承载”部分时,我正在发送整个 Authorization 标头。我从这个博客中得到了这个想法。删除“ Bearer ”部分后,它验证正常。

如果对其他人有帮助,这是更新的功能。

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);
    }
};
于 2014-12-13T17:02:02.030 回答
0

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

我通过获取您的 Authorization 标头输出来测试这一点,并将其复制并粘贴到 JWT 调试器中:http: //jwt.io

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

最好的!

智威汤逊调试

于 2014-12-12T17:32:34.197 回答
0

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

如果您在密码字段中将“selected: false”添加到您的猫鼬用户模式中,您可以避免返回它。如果这样做,请在登录的 find 方法中使用“+密码”表示法(如下所示):

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

希望这可以帮助!

于 2015-04-19T19:16:55.053 回答