调用用户API时出现Invalid token错误的排查求助
调用接口返回"Invalid token"错误排查
问题场景
调用localhost:3300/api/user/all等GET接口时,Postman返回错误:"error": "Invalid token"。已按照Bearer 格式在Authorization请求头中携带token,但错误依然存在。
user.js代码
const express = require("express"); const router = express.Router(); const User = require("../models/user"); const { verifyToken, verifyTokenAndAdmin, } = require("../routes/verifyToken"); router.get("/:id", verifyToken, async (req, res) => { try { const user = await User.findById(req.params.id); if (!user) { return res.status(404).json({ error: "User not found" }); } res.json(user); } catch (err) { res.status(500).json({ error: err.message }); } }); router.get("/", verifyTokenAndAdmin, async (req, res) => { try { const users = await User.find({}); res.json(users); } catch (err) { res.status(500).json({ error: err.message }); } }); router.put("/:id", verifyToken, async (req, res) => { try { const user = await User.findById(req.params.id); if (!user) { return res.status(404).json({ error: "User not found" }); } user.firstName = req.body.firstName; user.lastName = req.body.lastName; user.address = req.body.address; user.phone = req.body.phone; user.dateOfBirth = req.body.dateOfBirth; const updatedUser = await user.save(); res.json(updatedUser); } catch (err) { res.status(500).json({ error: err.message }); } }); router.delete("/:id", verifyTokenAndAdmin, async (req, res) => { try { const user = await User.findById(req.params.id); if (!user) { return res.status(404).json({ error: "User not found" }); } await user.remove(); res.json({ message: "User deleted successfully" }); } catch (err) { res.status(500).json({ error: err.message }); } }); module.exports = router;
verifyToken.js代码
const jwt = require("jsonwebtoken"); const verifyToken = (req, res, next) => { const authtoken = req.header("Authorization"); const token = authtoken.split(" ")[1]; if (!token) { return res.status(401).json({ error: "No token, authorization denied" }); } try { const decoded = jwt.verify(token, process.env.JWT_SECRET); req.user = decoded; next(); } catch (err) { console.log(token) res.status(401).json({ error: "Invalid token" }); } }; const verifyTokenAndAdmin = (req, res, next) => { verifyToken(req, res, () => { // Check if the user is an admin if (!req.user.isAdmin) { return res.status(403).json({ error: "Admin access required" }); } next(); }); }; const verifyTokenAndAuth = (req, res, next) => { verifyToken(req, res, () => { next(); }); }; module.exports = { verifyToken, verifyTokenAndAdmin, verifyTokenAndAuth, };
Postman请求截图

排查建议
- 核对JWT密钥:确认生成token时使用的
JWT_SECRET和验证代码中的process.env.JWT_SECRET完全一致,环境变量是否正确加载,没有拼写错误。 - 检查token有效期:如果生成token时设置了
expiresIn,确认当前时间未超过token过期时间。 - 校验请求头格式:确保Authorization头中
Bearer和token之间只有一个空格,没有多余字符(比如引号、空格)。 - 修复verifyToken函数漏洞:当前代码中如果Authorization头不存在,调用
split(" ")会直接抛出错误,建议先做判断:const verifyToken = (req, res, next) => { const authtoken = req.header("Authorization"); if (!authtoken || !authtoken.startsWith("Bearer ")) { return res.status(401).json({ error: "No token, authorization denied" }); } const token = authtoken.split(" ")[1]; try { const decoded = jwt.verify(token, process.env.JWT_SECRET); req.user = decoded; next(); } catch (err) { console.log(token) res.status(401).json({ error: "Invalid token" }); } }; - 确认权限匹配:如果调用的是管理员接口(比如
/api/user/all),检查token解码后的req.user.isAdmin是否为true,避免因权限不足触发错误。
内容的提问来源于stack exchange,提问作者Z3eme
相关产品推荐
相关产品推荐

