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

无法通过signedCookies获取Cookie值的技术求助

问题描述

使用Express框架时,编写verifyToken函数尝试通过req.signedCookies获取Cookie值,但控制台输出undefined。查看浏览器网络响应的Set-Cookie头部时,弹出提示:"This attempt to set a cookie was blocked due to user preferences"。

相关代码如下:

验证Token函数

import { NextFunction, Request, Response } from "express";
import { COOKIE_NAME } from "./constants.js";

export const verifyToken = async (
  req: Request,
  res: Response,
  next: NextFunction
) => {
  const token = req.signedCookies[`${COOKIE_NAME}`]; // 尝试获取Cookie值
  console.log(token);
};

登录控制器设置Cookie代码

export const userLogin = async (
  req: Request,
  res: Response,
  next: NextFunction
) => {
  try {
    const { email, password } = req.body;
    const user = await User.findOne({ email });
    if (!user) {
      return res.status(401).send("User not registered !");
    }
    const isPasswordCorrect = await compare(password, user.password);

    if (!isPasswordCorrect) {
      return res.status(403).send("Incorrect Password !!");
    }

    res.clearCookie(COOKIE_NAME, {
      httpOnly: true,
      path: "/",
      domain: "localhost",
      signed: true,
    });

    const token = createToken(user._id.toString(), user.email, "7d");
    const expires = new Date();
    expires.setDate(expires.getDate() + 7);
    res.cookie(COOKIE_NAME, token, {
      path: "/",
      domain: "localhost",
      expires,
      httpOnly: true,
      signed: true,
    });

    return res
      .status(200)
      .json({ message: "OK", name: user.name, email: user.email });
  } catch (error) {
    console.log(error);

    return res.status(200).json({ message: "ERROR", cause: error.message });
  }
};
原因分析
  1. Cookie属性缺失:现代浏览器默认对Cookie的SameSite属性有严格要求,未设置该属性的Cookie可能被判定为不安全而被阻止。
  2. 浏览器Cookie权限设置:用户浏览器可能开启了"阻止所有Cookie"或"阻止第三方Cookie"选项,导致localhost下的Cookie无法被存储。
  3. Cookie参数不一致:clearCookie与setCookie的参数(如domain、path)不匹配,可能导致旧Cookie未被清除,但核心问题仍为新Cookie未被浏览器接受。
解决方案

1. 补充Cookie的SameSite属性

在设置Cookie时添加sameSite属性,根据场景选择合适的值:

  • 若为同站请求(前后端同域名),设置sameSite: 'lax'或sameSite: 'strict';
  • 若为跨域请求,需设置sameSite: 'none',但必须同时开启secure: true(仅HTTPS环境生效,localhost的HTTP环境请勿设置secure: true)。

修改后的res.cookie代码:

res.cookie(COOKIE_NAME, token, {
  path: "/",
  domain: "localhost",
  expires,
  httpOnly: true,
  signed: true,
  sameSite: 'lax', // 同站场景推荐值
});

同时确保clearCookie参数与setCookie一致,添加sameSite:

res.clearCookie(COOKIE_NAME, {
  httpOnly: true,
  path: "/",
  domain: "localhost",
  signed: true,
  sameSite: 'lax',
});

2. 检查浏览器Cookie设置

  • 打开浏览器设置,找到Cookie相关选项,确保允许"来自网站的Cookie"或至少允许localhost的Cookie;
  • 若使用Chrome,可通过chrome://settings/cookies路径调整设置,添加localhost到允许列表。

3. 确认Express签名密钥

确保Express应用已正确配置cookieParser并传入签名密钥,否则signedCookies无法解析:

import cookieParser from 'cookie-parser';
app.use(cookieParser('your-secret-signing-key')); // 替换为实际密钥

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 16:04:55