【问题标题】:Cannot verify JWT - UnhandledPromiseRejectionWarning: JsonWebTokenError: jwt malformed无法验证 JWT - UnhandledPromiseRejectionWarning: JsonWebTokenError: jwt malformed
【发布时间】:2022-02-13 02:43:06
【问题描述】:

我的功能只是将数据发送到数据库(我的帖子)。我使用私钥和公钥来签名和验证令牌。我可以在标头中将这个令牌从前端发送到后端,但是在验证它时有问题。下面是这个流程的样子:

前端

router.post(`/p-p`, async (req, res) => {
  try {
    const data = await api.post(`/post-post`, req.body, {
      headers: {
        Authorization: 'Bearer ' + req.body.token
      }
    })
    res.json(data.data)
  } catch (e) {
    res.status(e.response.status).json(e.response.data)
  }
})

后端

router.post(
  "/post-post",
  auth,
  wrapAsync(generalController.postPost)
)

中间件认证

const jwtService = require('./../services/jwtService')

module.exports = async(req, res, next) => {
  if (req.headers.authorization) {
    const user = await jwtService.getUser(req.headers.authorization.split(' ')[1])
    if (user) {
      next();
    } else {
      res.status(401).json({
        error: 'Unauthorized'
      })
    }
  } else {
    res.status(401).json({
      error: 'Unauthorized'
    })
  }
}

和 JWT 服务

const jwt = require('jsonwebtoken');
const fs = require("fs");
const path = require("path");

const pathToKeys = path.resolve(__dirname, "../../keys");

module.exports = {
  sign(payload) {
    const cert = fs.readFileSync(`${pathToKeys}/private.pem`);
    return jwt.sign(
      payload,
      {
        key: cert,
        passphrase: process.env.JWT_PASSPHRASE
      },
      {
        algorithm: "RS256",
        expiresIn: "30m"
      }
    )
  },
  getUserPromise(token) {
    return new Promise((resolve, reject) => {
      jwt.verify(token, fs.readFileSync(`${pathToKeys}/public.pem`), (err, decoded) => {
        if(!err) {
          return resolve(decoded);
        } else {
          return reject(err);
        }
      })
    })
  },
  async getUser (token) {
    return await this.getUserPromise(token)
  }
}

问题在getUserPromise 函数之后开始。此函数可以获取令牌,但无法验证它,我遇到了这个问题:

UnhandledPromiseRejectionWarning: JsonWebTokenError: jwt malformed

实际上,我不知道问题出在哪里。我生成了密钥对,sign 函数可以唱歌并返回令牌,看起来像这样:351e38a4bbc517b1c81e180479a221d404c724107988852c7768d813dd0510e6183306b1d837091b2cddaa07f2427b7a

那么,有什么问题呢?

【问题讨论】:

  • 您确定您使用的是有效令牌吗?我只将 JWT 视为三个点分隔的 Base64 字符串,并且您似乎传递了一个十六进制值(并且是一个短值)。参见例如the jwt.io getting started page 用于通常格式
  • 这能回答你的问题吗? Json Web Token verify() return jwt malformed
  • 我不知道你在哪里以及如何调用 sign 函数,但在其中你调用 jwt.sign 并返回它作为结果,不知道如何从中获取十六进制字符串.十六进制字符串显然不是 JWT,不知道你是如何或从哪里得到它的。

标签: javascript node.js express jwt


【解决方案1】:

我找到了解决这个问题的方法,感觉很丢脸。在 JWT 服务中注意这个字符串:

algorithm: "RS256"

如您所见,我使用RS256,但我生成了其他格式的证书,因此,我收到了那个错误。

所以,如果你使用 RSA 证书,请注意算法!

编辑:

以下是为 RS256 生成对的方法:

  1. 私人
openssl genrsa -out private.pem -aes256 4096
  1. 从私人公开
openssl rsa -in private.pem -pubout > public.pem

【讨论】:

    猜你喜欢
    • 2017-03-08
    • 2020-12-25
    • 1970-01-01
    • 2018-07-14
    • 2016-08-25
    • 2022-07-05
    • 2021-11-03
    • 2020-11-26
    • 2017-07-31
    相关资源
    最近更新 更多