Node.js 使用ExpressJWT,为什么我的授权头在';很明显在那里
我正在使用expressjwt和jsonwebtoken 尝试使用jsonwebtoken.verify()时,出现以下错误: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令牌存在,因为我正在注销它。所以我不明白为什么标题会丢失,如果它清楚
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>> }