如何用Supertest获取HttpOnly Cookie并在后续请求中回传?
先澄清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
相关产品推荐
相关产品推荐

