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

MERN栈中HTTPOnly Cookie无法回传至服务端的问题排查

我用MERN栈开发项目,登录接口返回JSON格式的access token,同时通过res.cookie设置HTTPOnly的refresh token Cookie,代码如下:

const login = asyncHandler(async (req, res) =>{
const accessToken = 1234
const refreshToken = 5678
res.cookie("jwt", refreshToken, {
    httpOnly: true, 
    secure: false, 
    sameSite: "None",
    maxAge: 7 * 24 * 60 * 60 * 1000, 
    path: "/auth/refresh",
  });
  res.json({ accessToken });
}

按逻辑,调用刷新接口时,HTTPOnly Cookie应该自动回传给服务端,返回新的access token,刷新接口代码:

const refresh = (req, res) => {
  console.log("inside refresh");
  const cookies = req.cookies;
  console.log("cookies", cookies);

  if (!cookies?.jwt) {
    return res
      .status(401)
      .json({ message: "Unauthorized:No refresh token cookie found" });
  }

  const refreshToken = cookies.jwt;

  jwt.verify(
    refreshToken,
    process.env.REFRESH_TOKEN_SECRET,
    asyncHandler(async (err, decoded) => {
      if (err) {
        return res
          .status(403)
          .json({ message: "Forbidden: Wrong refresh token cookie" });
      }

      const foundUser = await User.findOne({ username: decoded.username });
      if (!foundUser) {
        res
          .status(401)
          .json({ message: "Unauthorized: wrong cookie send, no user found" });
      }

      const accessToken = jwt.sign(
        {
          UserInfo: {
            username: foundUser.username,
            roles: foundUser.roles,
          },
        },
        process.env.ACCESS_TOKEN_SECRET,
        { expiresIn: "20" }
      );
      res.json({ accessToken });
    })
  );
};

客户端刷新函数:

export async function refresh() {
  const res = await axios.get("/auth/refresh", {
    withCredentials: true,
  });

  return res.accessToken;
}

操作步骤:

  • 发送登录请求,确认返回access token,响应头的Set-Cookie已存储HTTPOnly Cookie;
  • 调用客户端refresh函数发请求,服务端刷新接口拿不到Cookie,打印cookies显示为[Object: null prototype]。

请问哪里操作错了?


排查方向及解决方案
  • sameSite与secure配置冲突:当sameSite设为"None"时,浏览器强制要求Cookie必须开启secure(仅HTTPS传输),否则会拒绝存储或携带该Cookie。开发环境如果用HTTP,要么把sameSite改成"Lax"/"Strict",要么开启本地HTTPS(比如用mkcert生成证书)。

  • Cookie路径限制过严:你设置了path: "/auth/refresh",意味着只有请求完全匹配该路径时才会携带Cookie。检查客户端请求路径是否和配置一致(比如有没有多写斜杠、是否带前缀),可以先把path改成"/"测试,确认能拿到Cookie后再按需调整。

  • 服务端未配置Cookie解析中间件:Express默认不解析Cookie,必须安装并使用cookie-parser中间件,否则req.cookies会是空对象。安装后在入口文件添加:

    const cookieParser = require('cookie-parser');
    app.use(cookieParser());
    
  • 跨域配置未允许凭证:如果前后端跨域,除了客户端设置withCredentials: true,服务端CORS配置必须指定具体前端域名(不能用*)并开启凭证支持:

    const cors = require('cors');
    app.use(cors({
      origin: 'http://localhost:3000', // 替换为你的前端地址
      credentials: true
    }));
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 14:43:18