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

Node.js React项目中Passport Google OAuth2.0+JWT触发ERR_HTTP_HEADERS_SENT错误

解决Passport Google OAuth2.0中ERR_HTTP_HEADERS_SENT错误

错误根源

你遇到的ERR_HTTP_HEADERS_SENT错误,核心原因是同一个HTTP请求发送了两次响应:

  • sendToken函数已经通过res.status().cookie().json()发送了完整的响应(包含状态码、Cookie、JSON数据)
  • 后续调用的redirect()(原代码还漏写了res.,应该是res.redirect())会再次尝试发送重定向响应头,违反了HTTP一次请求只能返回一个响应的规则

解决方案

方案一:Cookie存储JWT后重定向到前端(推荐)

修改backend/routes/auth.js中的回调逻辑,移除sendToken调用,直接生成令牌并设置Cookie,然后执行重定向,确保只发送一次响应:

router.get(
    "/google/callback",
    passport.authenticate('google', { failureRedirect: '/' }),
  function( req, res) {
    // 生成JWT令牌
    const token = req.user.getJwtToken();
    // 设置Cookie选项
    const options = {
        expires: new Date(
            Date.now() + process.env.COOKIE_EXPIRES_TIME * 24 * 60 * 60 * 1000
        ),
        httpOnly: true
    }
    // 将令牌存入Cookie
    res.cookie('token', token, options);
    // 重定向到前端仪表盘
    res.redirect(`http://localhost:3000/dashboard`);
  });

前端后续接口请求会自动携带该Cookie,后端可通过中间件验证令牌有效性。

方案二:返回JWT令牌由前端处理跳转(前后端完全分离场景)

如果希望后端仅返回令牌,由前端自行处理页面跳转,可保留sendToken调用并移除重定向代码:

router.get(
    "/google/callback",
    passport.authenticate('google', { failureRedirect: '/' }),
  function( req, res) {
    // 调用sendToken返回令牌及用户信息
    sendToken(req.user, 200, res);
    // 移除重定向代码,避免重复发送响应
  });

这种方式需要前端设置专门的回调路由(如/auth/google/callback),捕获谷歌的回调请求后,调用后端的/api/v1/google/callback接口获取令牌,再自行跳转到仪表盘页面。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 11:40:25