使用express-jwt,为什么我的授权标题明显丢失了

时间:2014-12-12 17:15:29

标签: node.js authentication token 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

3 个答案:

答案 0 :(得分:2)

我不得不接受@rdegges的回答,因为我跳了一下枪。发现调试器非常有用,但它在解决我的问题方面几乎没有什么帮助。

答案其实很简单。当我需要拆分它的'Bearer'部分时,我发送了整个Authorization标头。我从This blog得到了这个想法。删除'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);
    }
};

答案 1 :(得分:0)

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

我通过获取Authorization标头输出并将其粘贴到JWT调试器中进行了测试:http://jwt.io

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

最佳!

JWT Debugging

答案 2 :(得分:0)

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

如果你添加"选择:false"你可以避免它被退回。到密码字段中的mongoose用户架构。如果您这样做,请使用' +密码'登录的查找方法中的表示法(如):

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

希望这有帮助!