Node.js+express-session无法发送ID Token建立会话的问题
问题解决:无法接收Firebase ID Token到Express服务器
问题根源
你遇到的TypeError: Cannot read properties of undefined (reading 'token'),核心原因有两个:
- Express未配置JSON请求体解析中间件:前端发送的JSON格式请求体,Express默认不会解析,导致
req.body为undefined,自然拿不到token。 - 鉴权中间件逻辑错误:
checkAuth中间件用在GET路由上,但GET请求没有请求体,你从req.body.token获取令牌的方式完全错误。
修复步骤
1. 添加JSON解析中间件
在app.js的中间件配置中,添加express.json(),放在session中间件之后:
// Middleware app.use(session({ secret: 'your-secret-key', resave: false, saveUninitialized: true, cookie: { secure: false, httpOnly: true, maxAge: 24 * 60 * 60 * 1000 } // 1 day })); app.use(express.json()); // 新增这一行,解析JSON请求体 app.use(express.static(join(__dirname, 'public')));
这一步是解决Postman和前端请求都拿不到token的关键——没有这个中间件,req.body永远是undefined。
2. 修正鉴权中间件逻辑
checkAuth中间件是用于保护GET路由的,这些路由没有请求体,应该从req.session.token中获取之前存储的令牌,而不是req.body:
// Auth middleware const checkAuth = async (req, res, next) => { const token = req.session.token; // 从session中取token,不是req.body if (!token) { console.log('No Session token:'); return res.redirect('/'); } try { const decodedToken = await admin.auth().verifyIdToken(token); console.log('Decoded token:', decodedToken); req.user = decodedToken; next(); } catch (error) { console.error('Error verifying token:', error); res.redirect('/'); } };
3. 验证前端请求(可选)
前端的sendTokenToServer函数已经正确设置了Content-Type: application/json并发送JSON体,这部分无需修改,添加中间件后就能正常被服务器解析。
完整修正后的app.js关键部分
// Middleware app.use(session({ secret: 'your-secret-key', resave: false, saveUninitialized: true, cookie: { secure: false, httpOnly: true, maxAge: 24 * 60 * 60 * 1000 } // 1 day })); app.use(express.json()); // 新增JSON解析 app.use(express.static(join(__dirname, 'public'))); // Auth middleware const checkAuth = async (req, res, next) => { const token = req.session.token; if (!token) { console.log('No Session token:'); return res.redirect('/'); } try { const decodedToken = await admin.auth().verifyIdToken(token); console.log('Decoded token:', decodedToken); req.user = decodedToken; next(); } catch (error) { console.error('Error verifying token:', error); res.redirect('/'); } }; app.post('/set-token', (req, res) => { const token = req.body.token; // 现在能拿到值了 req.session.token = token; res.sendStatus(200); });
内容的提问来源于stack exchange,提问作者Bianco
相关产品推荐
相关产品推荐

