如何在Jest测试中发送signedCookie完成接口鉴权测试
核心注意点
Express的签名Cookie由
cookie-parser中间件基于配置的secret密钥生成,测试时使用的密钥必须和服务端启动时传入cookie-parser的密钥完全一致,否则会直接校验失败。
方案1:使用supertest测试(Express生态最常用方案)
绝大多数Jest测Express接口的场景都会配合supertest直接请求本地app实例,有两种携带签名Cookie的写法:
- 走真实登录流程获取Cookie(最贴近线上逻辑,推荐)
先调用登录接口拿到响应头里的set-cookie值,后续请求直接携带即可,示例代码:const request = require('supertest'); const app = require('../app'); // 导入你的Express实例 describe('需鉴权接口测试', () => { let authCookie; // 测试用例执行前先完成登录,拿到签名后的鉴权Cookie beforeAll(async () => { const loginResp = await request(app) .post('/api/login') .send({ username: 'test_account', password: 'test_password' }); // 从响应头提取你的鉴权Cookie,比如你的鉴权Cookie字段名为session authCookie = loginResp.headers['set-cookie'].find(item => item.startsWith('session=')); }); test('请求用户信息接口返回200', async () => { const res = await request(app) .get('/api/user/info') .set('Cookie', authCookie) // 携带签名Cookie .expect(200); expect(res.body.data.username).toBe('test_account'); }); }); - 手动构造签名Cookie(跳过登录流程,适合单测隔离场景)
如果不想依赖登录接口,可以直接用cookie-parser提供的签名方法手动生成合法Cookie,示例代码:const { signedCookie } = require('cookie-parser'); // 必须和服务端cookie-parser配置的secret完全一致 const COOKIE_SECRET = 'your_project_configured_cookie_secret'; test('手动构造Cookie访问管理员接口', async () => { // 构造你要存在Cookie里的鉴权数据 const cookiePayload = JSON.stringify({ userId: 1, role: 'admin' }); // 拼接成符合规范的签名Cookie字符串 const validAuthCookie = `session=${cookiePayload}.${signedCookie(cookiePayload, COOKIE_SECRET)}`; const res = await request(app) .get('/api/admin/permission') .set('Cookie', validAuthCookie) .expect(200); });
方案2:使用axios/原生http请求测试环境接口
如果是请求已经部署的测试环境接口,不需要启动本地app实例,直接把生成好的签名Cookie字符串放到请求头的Cookie字段即可:
const axios = require('axios'); test('请求测试环境接口携带鉴权Cookie', async () => { const res = await axios.get('https://test-env.example.com/api/user/info', { headers: { Cookie: validAuthCookie // 传入前面生成的合法签名Cookie即可,多个Cookie用分号分隔 } }); expect(res.status).toBe(200); });
常见踩坑
- 不要自行实现签名逻辑,直接用
cookie-parser导出的signedCookie方法生成,避免签名算法不匹配导致校验失败 - 从
set-cookie头提取的Cookie会自带httpOnly、path、maxAge等属性,不需要手动裁剪,直接整段传入请求头即可 - 如果服务端配置了Cookie密钥轮换,生成签名时必须使用当前服务端生效的密钥
内容的提问来源于stack exchange,提问作者eskil4152
相关产品推荐
相关产品推荐

