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

Node.js读取cookie中auth_token报错及JWT有效性校验问题

JWT校验功能修复方案

最初报错根因

你遇到的TypeError: Cannot read property 'auth_token' of undefined错误,本质是Express服务没有全局注册cookie-parser中间件,导致req对象上不存在cookies属性,读取auth_token时自然报错。你后续手动读取Cookie头的方案绕开了自动解析逻辑,无法直接提取指定的auth_token,也就没法做JWT有效性校验。

具体修复步骤

  1. 首先安装cookie-parser依赖(未安装的情况下执行)
    npm install cookie-parser

  2. 在项目主入口文件(通常是app.js/index.js)中全局注册cookie-parser,必须放在所有路由注册之前:

const express = require('express');
const cookieParser = require('cookie-parser');
const app = express();

// 注册中间件,顺序不能乱
app.use(cookieParser());
app.use(express.json());
app.use(express.urlencoded({extended: true}));

// 再注册你的业务路由
app.use('/auth', require('./routes/auth'));
// 受保护的路由前面加verifyToken中间件即可
app.use('/welcome', require('./routes/verifyToken'), (req, res) => {
  res.render('welcome');
});
  1. 还原verifyToken.js为正确逻辑,不需要在中间件内部单独注册路由和cookie-parser:
const jwt = require('jsonwebtoken');

module.exports = function(req,res,next){
    // 全局注册cookie-parser后,req.cookies会自动解析所有cookie
    const token = req.cookies.auth_token;
    if (!token) {
        return res.status(403).send('Access Denied');
    }
    try{
        // 自动校验JWT签名、有效期等属性
        const verified = jwt.verify(token, process.env.TOKEN_SECRET);
        req.user = verified;
        next();
    } catch (err) {
        // 注意cookie名要和你设置的auth_token保持一致,不要写错
        res.clearCookie('auth_token');
        res.status(403).send('Invalid Token');
    }
};

额外优化建议

  1. 修正auth.js注册接口的逻辑错误:目前你把res.redirect('/login')写在了数据库保存用户操作之前,会导致用户还没入库就跳转,修改为:
try{
    const savedUser = await user.save();
    // 保存成功后再跳转
    res.redirect('/login');
}catch(err){
    res.status(400).send(err);
}
  1. 生成JWT时添加有效期,避免永久有效带来的安全风险,修改auth.js登录接口的JWT生成逻辑:
const token = jwt.sign({_id: user._id}, process.env.TOKEN_SECRET, { expiresIn: '7d' });
  1. 部署到HTTPS环境时,将cookie的secure属性设为true,避免明文传输被窃取:
res.cookie('auth_token', token, {
    httpOnly: true,
    secure: process.env.NODE_ENV === 'production',
    maxAge: 7 * 24 * 60 * 60 * 1000 // 和JWT有效期保持一致
})

内容的提问来源于stack exchange,提问作者Alex

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 03:48:03