JWT nodejs / express - 无效签名

Posted

技术标签:

【中文标题】JWT nodejs / express - 无效签名【英文标题】:JWT nodejs / express - Invalid signature 【发布时间】:2019-08-04 08:31:59 【问题描述】:

我在使用 Jwt 时遇到问题,尤其是“无效签名”错误。

我在用户登录后生成一个令牌(jsonwebtoken)。

userSchema.methods.generateJwt = function() 
  var expiry = new Date();
  //expiry.setDate(expiry.getDate() + 7);

  expiry.setDate(expiry.getDate() + 2);
  return jwt.sign(
    _id: this._id,
    username: this.username,
    name: this.lastname,
    exp: parseInt(expiry.getTime() / 1000),
  , process.env.SRCT,  
    algorithm: 'HS256'
  );

然后我正在创建一个 express-jwt 中间件以将其添加到路由:

var auth = jwt(
  secret: process.env.SRCT,
  userProperty: 'payload'
);

这样使用:

router.get('/', auth, ctrlUser.slash);

根据调试器,我创建的 JWT 在前端请求(授权承载)中传递,与登录后立即创建的相同。

但不幸的是,在每次向 nodejs 后端请求之后,我仍然遇到错误 "message":"UnauthorizedError: invalid signature"。

有人能告诉我我做错了什么导致签名无效吗?

提前致谢

【问题讨论】:

【参考方案1】:

您的验证功能在哪里?您需要检查对受保护区域的每个请求是否确实有效,jwt 提供了一个函数 verify 来做到这一点。

【讨论】:

【参考方案2】:

您似乎没有解析令牌的请求标头,也没有为此使用 JWT 库的 verify() 函数。你的 auth 中间件应该是这样的

module.exports = (req, res, next) => 
    try 
        //parse the token from Authorization header (value of "bearer <token>")
        let token = req.headers.authorization.split(" ")[1];

        //verify the token against your secret key to parse the payload
        const tokenData = jwt.verify(token, process.env.JWT_SECRET_KEY);

        //add the data to the request body if you wish
        req.user = tokenData;
        next();
     catch (err) 
        res.status(401).json(
            message: "Unauthorized access error!",
        );
    
;

【讨论】:

以上是关于JWT nodejs / express - 无效签名的主要内容,如果未能解决你的问题,请参考以下文章

将 JWT 与 nodejs 和 express 一起使用

在nodejs,express和jwt中为相同的路由添加多个授权

Nodejs Express 用于 Web 应用程序 JWT,带有数据库或会话以验证用户身份

NodeJs Express passport-jwt 从令牌中获取错误的用户

在 Rest API 中使用 Facebook 在 Express 和 NodeJS 中维护 JWT 的密钥和访问令牌

Node.js - Express.js JWT 总是在浏览器响应中返回一个无效的令牌错误