You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

调用用户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请求截图

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 14:15:36