JWT 令牌无效,但为什么

JWT token invalid, but why

我正在做我的第一个授权练习,但我不明白我做错了什么。我正在尝试验证 JWT 令牌,但它告诉我它无效

我通过 httpie 获得令牌:

http POST :4000/auth/login email=test@test.com password=test

然后我尝试使用 httpie 进行验证:

http GET :4000/images authorization:"Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOjEsImlhdCI6MTY0ODgyMDI3MCwiZXhwIjoxNjQ4ODI3NDcwfQ.AhArOvQTaJ7ohbPiyGiGTK5pFMWqjbZ5Kj9q2hXEhXU"

这给我:无效的 JWT 令牌

这是我的 router/images.js

const { Router } = require("express");
const Image = require("../models").image;
const router = new Router();
const toData = require("../auth/jwt");

router.get("/images", async (req, res) => {
  const auth =
    req.headers.authorization && req.headers.authorization.split(" ");
  if (auth && auth[0] === "Bearer" && auth[1]) {
    try {
      const data = toData(auth[1]);
      const allImages = await Image.findAll();
      res.send(allImages);
    } catch (error) {
      res.status(400).send("Invalid JWT token");
    }
  } else {
    res.status(401).send({ message: "Please supply valid credentials" });
  }
});

这是router/auth.js

const { Router } = require("express");
const { toJWT, toData } = require("../auth/jwt");

const router = new Router();

router.post("/auth/login", async (req, res, next) => {
  try {
    const { email, password } = req.body;
    if (!email || !password) {
      return res.status(400).send("Email and password required");
    } else {
      res.send({ jwt: toJWT({ userId: 1 }) });
    }
  } catch (error) {
    console.log(error.message);
    next(error);
  }
});

module.exports = router;

这是auth/jwt.js

const jwt = require("jsonwebtoken");

const secret =
  process.env.JWT_SECRET || "e9rp^&^*&@9sejg)DSUA)jpfds8394jdsfn,m";

const toJWT = (data) => {
  return jwt.sign(data, secret, { expiresIn: "2h" });
};

const toData = (token) => {
  return jwt.verify(token, secret);
};

module.exports = { toJWT, toData };

希望有人能帮忙:)

在您的 router/images.js 文件中,您似乎没有正确要求 toData 方法。您需要具有两个导出函数的模块,因此如果您使用解构,则必须像在 auth.js.

中那样访问 toData 方法

将 router/images.js 的第 4 行更改为:

const { toData }  = require("../auth/jwt");

当您需要 auth/jwt 文件带有一个未解构的常量时,您将使用点符号访问该文件的导出方法:

const jwt = require("../auth/jwt");

jwt.toData(auth[0]);