无法通过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 }); } };
原因分析
- Cookie属性缺失:现代浏览器默认对Cookie的
SameSite属性有严格要求,未设置该属性的Cookie可能被判定为不安全而被阻止。 - 浏览器Cookie权限设置:用户浏览器可能开启了"阻止所有Cookie"或"阻止第三方Cookie"选项,导致localhost下的Cookie无法被存储。
- 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
相关产品推荐
相关产品推荐

