# 测试、安全与运维 ## 测试 `tests/unit` 覆盖脱敏、错误归一化、主题持久化、API 响应校验、认证原子存储、single-flight 续约、HTTP/HTTPS UUID v4 幂等键生成、幂等重试、401 单次重放、运行数据不变量、结果语义标识和运行进入终态时的最终结果同步。`tests/integration` 验证主题切换、逐条结果筛选与搜索、单条重试结果跨筛选置顶跟踪等页面交互,以及所有 service 到后端路由的映射。 ```bash pnpm test pnpm lint pnpm build ``` ## 安全 - 前端不包含 `TARGET_API_KEY` 或 `JUDGE_API_KEY`,也不应在 Vite 变量中暴露它们。 - 完整认证对象保存在 `localStorage` 以支持多标签页原子轮换,不分开写入 access/refresh token;生产环境必须使用 HTTPS 并保持严格 CSP,降低 XSS 窃取风险。 - 续约的待处理 refresh token 和 `Idempotency-Key` 作为一组保存;网络/5xx 失败后不换 key,refresh 401 或用户主动退出才清理凭据。 - HTTP 部署缺少 `crypto.randomUUID()` 时使用 Web Crypto `getRandomValues()` 生成标准 UUID v4;若浏览器连安全随机源也不支持则明确失败,绝不降级为 `Math.random()`。 - logger 对 password、token、API key、Authorization 等键及嵌套数据递归脱敏。 - UI 权限控制只用于交互,真实授权必须由后端执行。 - 生产环境应使用 HTTPS,并将后端 CORS 限制为实际前端域名。 ## 日志与错误 `VITE_LOG_LEVEL` 可为 `debug` / `info` / `warn` / `error`。生产环境推荐 `warn`。日志是结构化对象,但不发送到外部系统;如果日后引入观测平台,只需替换 `logging/logger.ts` 的输出端。React Error Boundary 处理未捕获的渲染错误,请求错误由页面提供重试入口。 ## 部署 Docker 采用 Node 构建 + Nginx 静态服务两阶段镜像。Nginx 配置了 SPA history fallback、静态资源缓存和 `/healthz`。API 地址在构建时写入: ```bash docker build --build-arg VITE_API_BASE_URL=https://api.example.com/api/v1 -t ai-safety-console-web . docker run --rm -p 8080:80 ai-safety-console-web ```