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有效性校验。
具体修复步骤
首先安装cookie-parser依赖(未安装的情况下执行)
npm install cookie-parser在项目主入口文件(通常是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'); });
- 还原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'); } };
额外优化建议
- 修正auth.js注册接口的逻辑错误:目前你把
res.redirect('/login')写在了数据库保存用户操作之前,会导致用户还没入库就跳转,修改为:
try{ const savedUser = await user.save(); // 保存成功后再跳转 res.redirect('/login'); }catch(err){ res.status(400).send(err); }
- 生成JWT时添加有效期,避免永久有效带来的安全风险,修改auth.js登录接口的JWT生成逻辑:
const token = jwt.sign({_id: user._id}, process.env.TOKEN_SECRET, { expiresIn: '7d' });
- 部署到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
相关产品推荐
相关产品推荐

