
如何把 Chat SDK × Managed Agents Quickstart 的演示 getUser 替换为真实用户身份校验【免费下载链接】claude-quickstartsA collection of projects designed to help developers quickly get started with building deployable applications using the Claude API项目地址: https://gitcode.com/GitHub_Trending/an/claude-quickstartsclaude-quickstarts仓库的managed-agents/chat-sdk子项目把一个研究分析 Agent 做成了浏览器聊天应用但它的身份校验是一个谁都能用的演示版本只要npm run dev起来任何能访问端口的人都能以同一个local用户身份发起研究轮次、列出全部会话并回放对话记录。本文的任务是把这个演示getUser替换为真实的用户身份校验完成校验后再把服务绑定到回环地址之外。适用前提是 quickstart 已按 skill.md 的 Setup checklist 跑通Node ≥ 22.9、.env中配置了ANTHROPIC_API_KEY或已执行ant auth login、CLAUDE_AGENT_ID和CLAUDE_ENVIRONMENT_ID页面在http://localhost:3000可用。演示版 getUser 的位置与风险身份入口在 src/bot.ts 里的getUser当前实现是这样的// src/bot.ts function getUser(_request: Request) { return { id: local, name: you }; } export { getUser as authenticate };它是所有暴露会话的路由唯一的身份来源web adapter 在每次POST /api/chat时都会调用它而 src/app.ts 中/api/activity、/api/sessions、/api/history也通过同一个authenticate做检查withUser中间件里authenticate返回假值就直接回 401。getUser返回null时所有路由一律 401演示版永远返回同一个用户所以本地环境永远不会出现 401。skill.mdgetUser is the security boundary 一节给出的风险描述是任何能触达端口的人都能run research turns on your bill, list your sessions, and replay their transcripts。这也是 src/main.ts 把默认绑定地址写死为127.0.0.1的原因——默认只在回环上监听把暴露面压到本机。用真实会话查找替换 getUserskill.md 给出的方向是把getUser替换为your real session lookup并明确列举了三种可行形态——NextAuth、Clerk、一个 session cookie对匿名请求返回null。函数契约保持不变接收Request解析出用户后返回带id和name的对象解析不出用户就返回null。由于文档没有内置具体的认证 SDK 代码下面是一个按契约书写的骨架TODO处换成你自己的会话查找逻辑从 cookie 或 header 解析出用户// src/bot.ts —— 替换演示版 getUser export async function getUser(request: Request) { // TODO: 换成真实会话查找NextAuth / Clerk / session cookie。 // 解析不出用户匿名请求时必须返回 null不能返回默认用户。 const user await resolveUserFromRequest(request); if (!user) return null; return { id: user.id, name: user.name }; } export { getUser as authenticate };保留export { getUser as authenticate }这一行src/app.ts 的非 chat 路由和activityThreadId都通过它做同一道检查。替换时有一个文档明确的硬约束src/bot.ts 的activityThreadId会对user.id做检查id里出现:会破坏web:{userId}:{conversationId}的往返解析导致该用户无法订阅活动流。如果你的用户体系产生的 ID 含冒号先做映射再返回。把会话范围限定到已校验用户只替换getUser还不够——同一 Agent 名下的所有会话彼此可见。skill.md 的 Production notes 给出的做法是创建会话时把解析出的用户 ID 写进 sessionmetadata然后在listSessions和ownedSession里按它过滤so one user cannot list or replay anothers conversations。对应到代码里是两处src/sessions.ts 的createSession目前写入的 metadata 是固定值// src/sessions.ts const session await client.beta.sessions.create({ agent: requireEnv(CLAUDE_AGENT_ID), environment_id: requireEnv(CLAUDE_ENVIRONMENT_ID), title: DEFAULT_SESSION_TITLE, metadata: { quickstart: chat-sdk }, });文档要求的改法是把getUser解析出的用户 ID 一并写进metadata字段名由你选定与过滤侧保持一致即可让每个会话可追溯到创建者。过滤侧在两个函数listSessions同文件目前按agent_id做服务端过滤并跳过terminated会话需要再按写入的用户 ID 过滤这样侧边栏只显示当前用户的会话ownedSessionsrc/managed-agents.ts这是所有浏览器提供 session ID路径的属主检查现有规则是 ID 形如合法 ID、能retrieve到、session.agent.id等于CLAUDE_AGENT_ID、未归档且未terminated按用户 ID 过滤就加在这里/api/history和/api/activity都会经过它。验证替换是否生效改完src/bot.tsnpm run dev带 watcher保存即重启后验证信号直接来自 skill.md 的调试表请求预期结果匿名请求不带有效会话凭证访问/api/chat、/api/sessions、/api/history、/api/activity401。调试表原文The shipped demo never 401s; this appears once you wire in real auth——出现 401 本身就说明真实校验已接入已认证用户发起一次研究请求正常走完整轮次几秒内收到确认消息随后是活动流与研究简报用 A 用户的凭证访问 B 用户的会话 ID经过ownedSession用户过滤后返回 404即使不过滤属于其他 Agent 或已归档的会话也一律 404如果替换后所有请求都 401说明getUser在正常请求上也返回了null或抛错——调试表把 /api/chatreturns 401 的原因归为 getUserreturnednullor threw此时先检查会话查找逻辑而不是其他链路。校验就位后再绑定到回环之外README 的 Configuration 表对HOST的说明是明确的前置条件Set0.0.0.0only after replacing the demogetUserDeployment 一节同样要求Replace it with your real session lookup before settingHOST。完成上面验证后# .env HOST0.0.0.0然后用不带 watcher 的npm start跑脚本为node --env-file-if-exists.env --import tsx src/main.ts得到一个长驻进程研究轮次期间响应流可持续保持数分钟。注意src/main.ts已把requestTimeout设为 0 以配合长响应但反向代理或负载均衡器仍会在自己的空闲超时报废这条连接——部署时为该路由调高代理的 idle/read 超时。如果目标主机不是本地 Node 服务器skill.mdDeploying off the Node server要求挂载deployedApi()而不是api并且先打开平台级访问保护把它当作getUser变真实之前的临时屏障。多实例部署时还需把createMemoryState()换成createRedisState()设置REDIS_URL并按会话 ID 做粘性路由这两点属于部署拓扑的额外要求本地单机验证可以跳过。可选对已认证用户再加一道花费闸门身份校验通过后skill.md 的 Production notes 仍建议限制用量check the resolved user ID against an allowlist ingetUseror rate-limit per thread in the message handler。即在同一处getUser里对解析出的用户 ID 做白名单判断不在名单内返回null即 401或在消息处理侧按 thread 限流。限制与边界getUser返回null是唯一被文档定义为未通过身份校验的信号所有路由统一以 401 表达不要为匿名请求发明一个默认用户。用户 ID 不能包含:这是 src/bot.ts 中activityThreadId的硬规则。ownedSession的 Agent 属主检查session.agent.id必须等于CLAUDE_AGENT_ID在用户过滤之外独立生效用户过滤是叠加在它之上的一层两层都要保留。平台级访问保护只是部署过渡期的 stopgap不能替代getUser的真实会话查找。【免费下载链接】claude-quickstartsA collection of projects designed to help developers quickly get started with building deployable applications using the Claude API项目地址: https://gitcode.com/GitHub_Trending/an/claude-quickstarts创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考