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

如何用Supertest获取HttpOnly Cookie并在后续请求中回传?

解决:用Supertest测试依赖HttpOnly Cookie认证的Express接口

先澄清HttpOnly Cookie的误区

HttpOnly的作用是阻止前端JavaScript通过document.cookie读取该Cookie,但完全不影响浏览器自动回传:当你发起符合规则(同源/匹配SameSite设置、满足Secure要求)的请求时,浏览器会自动把所有符合条件的Cookie(包括HttpOnly类型)塞进请求的Cookie头里发给服务器,这个过程不需要任何JS代码参与,是浏览器的默认行为。所以你完全可以把拿到的HttpOnly Cookie回传给服务器,只是不能用JS读取它的具体值而已。

Supertest的正确写法

你现在的问题是把Cookie放到了自定义的jwt请求头里,而服务器是从标准的Cookie头中读取jwt的。修改测试代码如下:

const logInResponse = await api.post('/api/users/authenticate').send(userAcctCreationDetails);
const jwtForTest = logInResponse.body.accessToken;
const allMentors = await Mentor.find({});
const testAccountMentorId = allMentors.find((mentor) => mentor.email === userToDelete.email)?._id.toString();

// 取出登录响应里的set-cookie头,注意可能是多个Cookie的数组
const cookies = logInResponse.headers['set-cookie'];
const deletedProfileResponse = await api
    .delete('/api/mentor/auth/delete/' + testAccountMentorId)
    // 注意:如果你的passport-jwt是从Cookie提取jwt,这里的Authorization头可能多余
    // .set('Authorization', 'Bearer ' + jwtForTest)
    .set('Cookie', cookies); // 把set-cookie的内容直接放到Cookie请求头中

额外提示

  • 如果登录接口返回多个Cookie,直接把整个set-cookie数组传给.set('Cookie', cookies)就行,Supertest会自动处理成正确的请求头格式。
  • 核对你的passport-jwt配置:确认它是从Cookie中提取jwt字段,还是从Authorization头提取Bearer token。如果是前者,那测试时不需要带Authorization头;如果是后者,说明你可能混淆了accessToken和refreshToken的分工——一般accessToken放在Authorization头用于接口认证,refreshToken放在HttpOnly Cookie用于刷新token。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 16:35:22