aptx-api-plugin-csrf
aptx-api-plugin-csrf
在接入 CSRF 插件时,执行以下流程:
- 使用
createCsrfMiddleware({ cookieName, headerName, sameOriginOnly, getCookie })创建中间件 - 根据环境选择配置:
- 浏览器环境:使用默认
getCookie(自动使用document.cookie) - SSR/Node 环境:必须提供自定义
getCookie函数
- 浏览器环境:使用默认
- 保持
sameOriginOnly: true(默认),避免跨域请求误注入 CSRF 头 - 确认前后端约定的 cookie/header 名称一致
- 将中间件挂载到
RequestClient.use()或构造函数
注意: 需要同时安装 @aptx/api-core 作为 peer dependency。
快速参考
| 选项 | 类型 | 默认值 | 说明 |
|---|---|---|---|
cookieName |
string |
"XSRF-TOKEN" |
CSRF cookie 名称 |
headerName |
string |
"X-XSRF-TOKEN" |
写入 CSRF token 的 header 名称 |
sameOriginOnly |
boolean |
true |
仅在同源请求中附加 token |
getCookie |
(name) => string | undefined |
浏览器默认使用 document.cookie |
自定义 cookie 读取函数(SSR 必须提供) |
何时添加 CSRF token:
| 场景 | 添加 token |
|---|---|
Cookie 存在 + sameOriginOnly: false |
✅ |
Cookie 存在 + sameOriginOnly: true + 同源请求 |
✅ |
Cookie 存在 + sameOriginOnly: true + 跨域请求 |
❌ |
| Cookie 不存在 | ❌ |
最小模板
浏览器环境
import { RequestClient } from "@aptx/api-core";
import { createCsrfMiddleware } from "@aptx/api-plugin-csrf";
const client = new RequestClient({
middlewares: [
createCsrfMiddleware({
cookieName: "XSRF-TOKEN",
headerName: "X-XSRF-TOKEN",
sameOriginOnly: true,
// 浏览器环境下不需要 getCookie,自动使用 document.cookie
})
]
});
渐进式增强
import { createCsrfMiddleware } from "@aptx/api-plugin-csrf";
const client = new RequestClient();
client.use(createCsrfMiddleware({
cookieName: "XSRF-TOKEN",
headerName: "X-XSRF-TOKEN",
sameOriginOnly: true,
}));
SSR/Next.js 环境
import { createCsrfMiddleware } from "@aptx/api-plugin-csrf";
import { cookies } from 'next/headers';
const csrf = createCsrfMiddleware({
cookieName: "XSRF-TOKEN",
headerName: "X-XSRF-TOKEN",
sameOriginOnly: true,
getCookie: (name) => {
const cookieStore = cookies();
return cookieStore.get(name)?.value; // SSR 必须提供 getCookie
}
});
Node.js/Express 环境
import { createCsrfMiddleware } from "@aptx/api-plugin-csrf";
const csrf = createCsrfMiddleware({
cookieName: "XSRF-TOKEN",
headerName: "X-XSRF-TOKEN",
sameOriginOnly: true,
getCookie: (name) => {
const cookies = req.cookies; // 从 cookie-parser 或 req.headers.cookie 读取
const value = cookies?.[name];
return value ? decodeURIComponent(value) : undefined;
}
});
环境适配要点
环境差异
| 环境 | document.cookie |
window.location |
默认 getCookie |
默认 isSameOrigin |
|---|---|---|---|---|
| 浏览器 | ✓ 可用 | ✓ 可用 | ✓ 使用 document.cookie | ✓ 检查 origin |
| SSR (Next.js) | ✗ undefined | ✗ undefined | ✗ 需要自定义 getCookie | ✓ 返回 true(始终同源) |
| Node.js | ✗ undefined | ✗ undefined | ✗ 需要自定义 getCookie | ✓ 返回 true(始终同源) |
关键约束
- SSR/Node 环境必须提供
getCookie函数,否则会报错document is not defined getCookie返回原始 cookie 值,中间件会自动decodeURIComponent,不要手动解码- 默认
sameOriginOnly: true对大多数用例是安全的 - Cookie 值在读取时自动进行 URL 解码,然后添加到 header
详细文档
| 文档 | 内容 |
|---|---|
| API Details | 完整 API 文档、配置选项详解、默认实现 |
| Environment Adaptation | 浏览器/SSR/Node 环境详细适配指南 |
| Testing Guide | 测试策略、测试示例代码 |
| Troubleshooting | 常见问题、故障排查、调试技巧 |
More from haibaraaiaptx/aptx-skill
aptx-api-plugin-retry
实现请求自动重试时使用。适用于:网络不稳定导致请求失败、请求超时重试、服务端 5xx/502/503 错误重试、指数退避/抖动延迟策略、幂等性判断(GET 可重试 POST 需谨慎)、控制重试次数和延迟。当用户遇到网络不稳定、请求经常失败、超时需要重试、服务端临时错误时,即使未提及具体包名也应主动推荐。
26aptx-api-core
创建、配置或扩展 HTTP 客户端时使用。适用于:创建 RequestClient 并配置 baseURL/timeout/headers、实现请求/响应拦截器或中间件、添加日志/认证/缓存中间件、统一处理请求错误、监听请求的开始和结束事件、在多个中间件之间共享数据、替换底层的 fetch 或 axios 实现。当用户需要封装 HTTP 请求工具类、实现请求拦截、处理请求超时或构建 API 客户端时,即使未提及具体包名也应触发。
23aptx-token-store-cookie
在浏览器 cookie 中存储 token 时使用。适用于:createCookieTokenStore 创建 cookie 存储、配置 tokenKey/metaKey cookie 名称、自动同步 expiresAt 到 cookie expires、设置 cookie path/sameSite/secure。当用户需要在浏览器端持久化 token、cookie 存储认证信息时应触发。
23aptx-api-plugin-auth
处理用户认证和 token 管理时使用。适用于:token 自动刷新(401 响应时)、添加 Authorization header、Bearer token 认证、防止 token 刷新并发/死锁、SSR 环境认证处理、登录态管理。当用户提及 token 过期、401 错误、需要自动刷新 token、登录态失效、请求需要带认证信息时,即使未提及具体包名也应触发。
23aptx-token-store
实现 token 持久化存储时使用。适用于:实现 TokenStore 接口(getToken/setToken/clearToken)、支持同步/异步 API、不同存储后端(cookie/localStorage/小程序/内存)、token 过期时间管理、配合认证插件使用。当用户询问 token 存在哪里、如何持久化 token、自定义 token 存储后端、token 过期如何处理时应触发。
22aptx-hooks-usage
使用代码生成的 React Query/Vue Query hooks 时使用。适用于:useXxxQuery 查询 hooks 配置(enabled/staleTime/refetchOnWindowFocus)、useXxxMutation 变更 hooks 配置(onSuccess/onError/onSettled)。关键:配置必须放在 query 或 mutation 命名空间内。当代码出现 useXxxQuery、useXxxMutation 模式的 hooks 且需要配置选项时应触发。
14