freeCodeCamp E2E 测试中 API 请求如何携带 CSRF token?
freeCodeCamp E2E 测试中 API 请求如何携带 CSRF token【免费下载链接】freeCodeCampfreeCodeCamp.orgs open-source codebase and curriculum. Learn math, programming, and computer science for free.项目地址: https://gitcode.com/GitHub_Trending/fr/freeCodeCamp在 freeCodeCamp 仓库的e2e/目录下新增或修改 Playwright 测试时只要测试需要向 API 发送POST/PUT请求例如保存进度、更新设置、删除账户请求就必须携带 CSRF token否则会被 API 的 CSRF 保护拦截。本文说明该仓库 e2e 套件中 token 的来源、携带方式和验证方式让你在新写的测试用例中直接沿用同一套模式。API 侧的 CSRF 机制token 从哪来、校验什么先看服务端约定理解 e2e 代码里为什么这样取值。在 csrf 插件 中定义了两个常量CSRF_COOKIE csrf_tokencookie 名CSRF_HEADER csrf-token请求头名。插件注册了fastify/csrf-protection并通过getToken: req req.headers[CSRF_HEADER]声明token 只从csrf-token请求头读取。同时除/signout外的所有请求都会触发onRequest钩子把新生成的 token 写入csrf_tokencookie属性为sameSite: strict、signed: false、httpOnly: false。源码注释解释了最后一点cookie 必须可被客户端读取才能在下一个请求中放进请求头发回。校验钩子在 api/src/app.ts 中启用需要认证的路由组在onRequest阶段挂上了fastify.csrfProtection。插件配套测试 api/src/plugins/csrf.test.ts 记录了三种结果缺少_csrfsecret cookie返回 403csrf_token与 secret 不匹配无效 token返回 403携带有效csrf_tokencookie 和csrf-token头请求正常处理返回 200。_csrfcookie 是fastify/csrf-protection下发的 secret与csrf_token一起随会话存在e2e 侧只需要拿到csrf_token并放进头里。e2e 侧token 随登录后的 storageState 一起保存e2e 测试不单独请求 token 端点而是复用登录会话里的 cookie。链路如下。e2e/playwright.config.ts 启动时先用 dotenv 加载仓库根目录的.envbaseURL取process.env.HOME_LOCATION默认http://127.0.0.1:8000并全局设置storageState: playwright/.auth/certified-user.json。API_LOCATION在 sample.env 中给出的本地值是http://localhost:3000。e2e/global-setup.ts 定义了setup项目beforeAll中先执行node ../tools/scripts/seed/seed-demo-user播种演示用户会向数据库写入种子数据是本地开发环境操作然后request.get(process.env.API_LOCATION /signin)完成登录最后request.storageState({ path: playwright/.auth/certified-user.json })把整个会话的 cookie——包括csrf_token——落盘。所有依赖setup的浏览器项目加载这份 storage state 后请求上下文里就同时具备了登录凭证和 CSRF cookie。也就是说只要走global-setup.ts的 setup 流程登录过request.storageState()里就能找到csrf_tokencookie。测试代码中的两种携带方式方式一authedRequest辅助函数对大多数已登录用户调受保护接口的用例直接复用 e2e/utils/request.ts 中的authedRequestconst csrfToken (await request.storageState()).cookies.find( c c.name csrf_token )?.value; expect(csrfToken).toBeTruthy(); const res await requestmethod, { data, headers: { csrf-token: csrfToken! } } ); expect(res.status()).toBe(200);它的约束是明确的只接受method: post | put和data: Recordstring, unknown参数endpoint没有前导/时会自动补上从当前请求上下文的 storage state 里找csrf_tokencookie找不到时expect(csrfToken).toBeTruthy()直接让测试失败请求发出后断言状态码为 200。仓库中多个用例已经这样调用例如 e2e/editor.spec.ts 顶部就是import { authedRequest } from ./utils/request;其他调用方还有 e2e/projects.spec.ts、e2e/hotkeys.spec.ts、e2e/completion-modal.spec.ts 等可以打开参考具体传参。方式二isolatedUserfixture测试用独立新账号当用例需要一个全新的、与其他测试互不影响的账号时使用 e2e/fixtures/isolated-user.ts 导出的 fixture。它内部自己完成了同样的登录拿 cookie、调接口带头流程用randomUUID()生成一次性邮箱创建空 cookie 上下文GET /signin?email...maxRedirects: 0要求返回 302 且 cookie 中出现jwt_access_token否则抛错说明登录失败测试 teardown 时调用/account/delete清理账号请求体为空、头里带csrf-token: csrfToken。这里有两处针对 token 的失败处理token 缺失时抛出Could not clean up the isolated user: CSRF token missing.删除响应不是 200 时抛出包含状态码和响应体的错误。该文件里的getCsrfToken就是取值逻辑的最小实现const getCsrfToken async (request: APIRequestContext) (await request.storageState()).cookies.find( cookie cookie.name csrf_token )?.value;新写一个独立用户用例时导入这里的test即可使用isolatedUser含email和storageState两个字段。如何验证携带是否正确测试通过即验证authedRequest已断言 200API 侧插件测试 api/src/plugins/csrf.test.ts 表明 200 与 403 的分界就是 token 是否有效。token 缺失的失败信号expect(csrfToken).toBeTruthy()或 fixture 的CSRF token missing.异常说明当前请求上下文里没有登录会话storage state 未加载、或上下文是空的且未先登录而不是网络问题。响应 403对应 API 侧_csrfsecret 缺失或 token 无效的情况e2e 里通常表现为 storage state 过期或会话不完整重新跑 setup 项目重新登录可刷新csrf_token。运行与限制在e2e/目录下e2e/package.json 提供的入口是pnpm playwright:run该脚本实际执行turbo setup playwright test先运行global-setup.ts播种并登录再跑各浏览器项目。配置中的webServer还会用 Docker 拉起 mailpitdocker run --rm -p 1025:1025 -p 8025:8025 axllent/mailpit供发邮件类测试接收邮件因此运行环境需要可用的 Docker 和已按 sample.env 配置好.env的本地 API 服务。两点边界需要留意isolatedUserfixture 的 teardown 会真实调用/account/delete删除刚创建的账号这是预期的清理行为不是额外破坏csrf_tokencookie 的sameSite: strict属性意味着该 cookie 只随同源请求回传e2e 中始终通过request.storageState()读取 cookie 值再显式放入csrf-token头而不是依赖浏览器自动回传。如果你只是要在浏览器 UI 层调试同样的机制api/src/app.ts 中 Swagger UI 的requestInterceptor展示的是同一模式从document.cookie里找出csrf_token写入req.headers[csrf-token]后再发请求。【免费下载链接】freeCodeCampfreeCodeCamp.orgs open-source codebase and curriculum. Learn math, programming, and computer science for free.项目地址: https://gitcode.com/GitHub_Trending/fr/freeCodeCamp创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

CANN/ge图引擎CreateCustomValue API

CANN/ge图引擎CreateCustomValue API

CreateCustomValue 【免费下载链接】ge GE(Graph Engine)是面向昇腾的图编译器和执行器,提供了计算图优化、多流并行、内存复用和模型下沉等技术手段,加速模型执行效率,减少模型内存占用。 GE 提供对 PyTorch、TensorF…

2026/9/10 5:09:04 阅读更多 →
CVAT 数据标注完整指南:Docker 5分钟部署,从建项目到导出训练集

CVAT 数据标注完整指南:Docker 5分钟部署,从建项目到导出训练集

CVAT 数据标注完整指南:Docker 5分钟部署,从建项目到导出训练集 【免费下载链接】cvat Computer Vision Annotation Tool (CVAT) is a leading platform for building high-quality visual datasets for vision AI. It offers open-source, cloud, and e…

2026/9/10 5:09:04 阅读更多 →
Appsmith 的 Cursor AI 协作开发规范:.cursor 目录设计、规则体系与工程实践

Appsmith 的 Cursor AI 协作开发规范:.cursor 目录设计、规则体系与工程实践

Appsmith 的 Cursor AI 协作开发规范:.cursor 目录设计、规则体系与工程实践 【免费下载链接】appsmith Platform to build admin panels, internal tools, and dashboards. Integrates with 25 databases and any API. 项目地址: https://gitcode.com/GitHub_Tre…

2026/9/10 5:09:04 阅读更多 →

最新新闻

本地Agent工作流接入WorkBuddy开放平台:从概念到生产的完整指南

本地Agent工作流接入WorkBuddy开放平台:从概念到生产的完整指南

最近把本地 Agent 工作流整个翻新了一遍,过程中绕了不少弯路,也踩了几个文档里根本不会写的坑。我把这段从零接入 WorkBuddy 开放平台、把一个本地工具链改造成标准 Agent 应用的完整路径整理出来,希望能帮到同样在折腾 API 接入和个人 Agent…

2026/9/10 5:48:25 阅读更多 →
如何用 kitty panel kitten 在桌面渲染 dock 面板或把终端程序作为壁纸

如何用 kitty panel kitten 在桌面渲染 dock 面板或把终端程序作为壁纸

如何用 kitty panel kitten 在桌面渲染 dock 面板或把终端程序作为壁纸 【免费下载链接】kitty If you live in the terminal, kitty is made for you! Cross-platform, fast, feature-rich, GPU based. 项目地址: https://gitcode.com/GitHub_Trending/ki/kitty 如果你…

2026/9/10 5:48:25 阅读更多 →
Wiki与RAG不是二选一:知识存储与调用的协同架构

Wiki与RAG不是二选一:知识存储与调用的协同架构

1. 这不是“选一个”,而是“搭一套”:Wiki 和 RAG 的本质分工错位很多人看到标题“Wiki 和 RAG 如何选择”,第一反应是:我该用 Wiki 做知识库,还是用 RAG 做知识库?——这个提问本身,就踩进了最…

2026/9/10 5:48:25 阅读更多 →
AI Agent长期记忆为何需要PolarDB-X这类分布式数据库

AI Agent长期记忆为何需要PolarDB-X这类分布式数据库

1. 为什么 AI Agent 的长期记忆不能靠 Redis 或本地文件硬扛?AI Agent 的“记忆”不是人类那种模糊、联想式的存储,而是一套严格结构化的状态管理机制。短期记忆(Short-term Memory)通常用 LRU 缓存或内存队列实现,比如…

2026/9/10 5:48:25 阅读更多 →
Jsteg算法:基于DCT系数LSB替换的JPEG隐写技术

Jsteg算法:基于DCT系数LSB替换的JPEG隐写技术

简介:这是一份基于JPEG图像实现Jsteg信息隐藏算法的Matlab源码资源,面向信息隐藏、数字水印与图像处理方向的学习者和研究者。资源提供完整的算法实现,涵盖DCT变换、量化、ZigZag扫描、Huffman编解码等JPEG核心流程,并重点演示了如…

2026/9/10 5:48:25 阅读更多 →
网络诈骗精准化演进与多渠道协同防御研究

网络诈骗精准化演进与多渠道协同防御研究

摘要网络诈骗正在从粗放式群发向精准化运营转型,威胁行为者根据目标群体的媒介使用习惯、心理预期与时间节律,对冒充对象、传播渠道与攻击时段进行精细化匹配。本文以网络安全厂商 Malwarebytes 于 2026 年 4 月中旬至 7 月中旬采集的全球威胁遥测数据为…

2026/9/10 5:47:24 阅读更多 →

日新闻

Leaflet离线地图完整Demo合集:内网部署与坐标纠偏实战

Leaflet离线地图完整Demo合集:内网部署与坐标纠偏实战

简介:这是一份面向Web GIS开发者的LeafLet离线地图示例合集,帮助开发者快速掌握离线地图从搭建到交互的完整流程。压缩包共723个文件,大小14.06MB,以319个js脚本、175个html页面和29个css样式文件为主体,配合png/svg图…

2026/9/10 0:00:35 阅读更多 →
MATLAB读取Rinex 3.02观测文件:多系统GNSS数据解析实战

MATLAB读取Rinex 3.02观测文件:多系统GNSS数据解析实战

简介:基于MATLAB开发的Rinex3.02版观测文件(o文件)读取代码包,面向卫星定位导航方向的学习者与研究人员,用于解决新版观测文件的数据解析、历元提取与时间转换问题。压缩包共4个文件,包含两个m脚本、一个19…

2026/9/10 0:00:35 阅读更多 →
后台管理系统设置页面开发实战:权限模型与动态路由设计

后台管理系统设置页面开发实战:权限模型与动态路由设计

1. 系统设置页面的整体设计与思路拆解 1.1 为什么系统设置页面是后台管理系统的“地基” 很多前端新人最开始接触后台管理项目时,往往会把精力放在“看起来炫酷”的业务页面上,比如数据大屏、复杂表单、图表联动。但真正经历过几个完整项目之后&#xf…

2026/9/10 0:00:35 阅读更多 →

周新闻

超人会飞不算本事:系统稳定依赖清晰规则与边界设计

超人会飞不算本事:系统稳定依赖清晰规则与边界设计

开头先不绕弯子。“#斯坦李吐槽dc 所以超人是无缘无故会飞的嘛哈哈哈哈哈哈哈锤哥真是技术人才啊!#雷神 #复联”这类调侃式短标题,第一波冲击力在于它把两个宇宙的角色塞进同一个吐槽箱里,但细想一下就能发现,它真正碰到的根本不是…

2026/9/9 10:51:30 阅读更多 →
超人VS蜘蛛侠:拆解超级IP的影响力与传播方法论

超人VS蜘蛛侠:拆解超级IP的影响力与传播方法论

把“蜘蛛侠 vs 超人”放在 CSDN 上聊,可能很多人第一反应是走错片场了。但如果把这两个角色看成“两个持续运营了 80 多年的文化产品”,你会发现,这场比较本质上是两个不同 IP 策略的长期结果对比:超人赢在定义了整个超级英雄题材…

2026/9/10 4:47:11 阅读更多 →
基于CNN的调制信号识别:MATLAB实现时频图分类实战

基于CNN的调制信号识别:MATLAB实现时频图分类实战

简介:本资源是一套面向通信工程与信号处理方向学习者、研究者的深度学习实践方案,聚焦调制信号自动检测与识别这一典型无线通信任务,解决传统方法依赖人工特征、低信噪比下性能下降等痛点。压缩包共12个文件(10.73MB)&…

2026/9/9 7:35:54 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/9 7:36:02 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/9 7:36:09 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/9 7:36:01 阅读更多 →