可以使用 Supertest 检索 httpOnly cookie 并将其在以下请求中发送回来吗?

问题描述 投票:0回答:1

我正在尝试访问 Express 服务器上的端点,该端点具有仅 http 的 cookie,作为获取访问权限的身份验证舞蹈的一部分。

这里我们设置http only cookie:

res.cookie('jwt', refreshToken, { httpOnly: true, sameSite: 'none', secure: true, maxAge: 3 * 24 * 60 * 60 * 1000 }); 
            return res.send({ accessToken, role: userModel.role, profileId: userModel.profile });

这是我正在尝试集成测试的端点:

router.delete('/auth/delete/:id', basicAuth, checkAccountId, mentors.deleteMentorProfile);

里面

basicAuth
有这个:
export const basicAuth = passport.authenticate('jwt', { session: false, failWithError: true });

我认为需要的是 httponly cookie 随请求一起发送到此端点。该行显示

passport.authenticate('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();
            // act
            const cookies = logInResponse.headers['set-cookie'][0];
            // console.log(cookies);
            const deletedProfileResponse = await api
                .delete('/api/mentor/auth/delete/' + testAccountMentorId)
                .set('Authorization', 'Bearer ' + jwtForTest)
                .set('jwt', cookies); // this fails!

console.log(cookies)
表示一些以
  jwt=eyJhbGciOi...-2n21vxTNPOlS94-YeFhSN7o; Max-Age=259200; Path=/; Expires=Thu, 15 Dec 2022 01:26:24 GMT; HttpOnly; Secure; SameSite=None

结尾的身份验证凭据

我的同事告诉我“httponly 意味着客户端无法访问它”,但我至少可以将其发回吗?如果不通过 javascript,浏览器如何将其发回?

注意我用谷歌搜索了,我发现关于超级测试和仅HTTP cookie的信息非常匮乏。

cookies jestjs supertest
1个回答
0
投票
从登录中提取cookie

.then((res) => { cookie = res.headers["set-cookie"]; });
然后设置cookie

.set("cookie", cookie)`
这将在请求的 req 中附加 http cookie 

在某些情况下,您还需要

cookie-parser

查看超级测试自述文件 - 
https://github.com/ladjs/supertest#readme

© www.soinside.com 2019 - 2024. All rights reserved.