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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 07:14:52