Jsonwebtoken 始终验证 return 仅 {iat: xxx }

Jsonwebtoken verify always return only {iat: xxx }

根据文档,https://github.com/auth0/node-jsonwebtoken#jwtverifytoken-secretorpublickey-options-callbackjwt.verify 将 returns 解码负载,我 运行 简单脚本:

var token = jwt.sign({email: req.body.email,}, 's3cr3t');
var decoded = jwt.verify(token, 's3cr3t');
console.log(decoded)

但它只输出如下:{ iat: 1470725598 }

我希望输出应该像 {email: myemail@domain.com,}

有什么我遗漏的吗?

验证函数采用第三个参数,function (err, decoded)。 您的代码应如下所示:

jwt.verify (token, "s3cr3t", function (err, decoded) {
    if (err) throw err;

    // decoded object with your data
}

在将 属性 req.body.email 设置为 undefined 之前,我无法模拟您的问题。

示例:

var jwt = require('jsonwebtoken');
var token = jwt.sign({email: undefined}, 's3cr3t');
var decoded = jwt.verify(token, 's3cr3t'); 

如果未定义,输出将如下所示;

{ iat: 1470727340 }

这与您所拥有的完全匹配,这让我怀疑您的主要问题只是 属性 req.body.email undefined.

假设 req.body.email 正确设置为 "myemail@domain.com" 那么输出将是;

{ email: 'myemail@domain.com', iat: 1470727500 }

这里只是一个旁注。您可能需要考虑将 .verify 方法包装在 try-catch 子句中,如文档中所示。这对于在令牌无效时验证和抛出错误很有用。

我知道这是一个老问题,但没有明确的解决方案来说明如何重现该问题。我最近也遇到了同样的问题:Decoded values where like {iat:xxxz}

这是为什么:

发送没有“Content-type: application/json”的 post 请求将导致 req.body.email 未定义。这不是您尝试 jwt.verify 的值,因此出现意外行为。

解决了在 post 请求的 headers 上添加“Content-type application/json”的问题。并确保以有效的 json 格式发送 de object,属性必须类似于:

{"email":"mi@email.com"}