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
相关产品推荐
相关产品推荐

