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]);
我正在做我的第一个授权练习,但我不明白我做错了什么。我正在尝试验证 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]);