【问题标题】:JWT nodejs / express - Invalid signatureJWT nodejs / express - 无效签名
【发布时间】: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"}。

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

提前致谢

【问题讨论】:

    标签: node.js angular express jwt


    【解决方案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!",
              });
          }
      };
      

      【讨论】:

        猜你喜欢
        • 2020-06-16
        • 2016-12-29
        • 2020-01-21
        • 2018-01-24
        • 1970-01-01
        • 1970-01-01
        • 2018-06-14
        • 2018-05-08
        • 2019-01-02
        相关资源
        最近更新 更多