TREK 管理员实战MCP Access 面板全面管理 OAuth 会话与 API 令牌【免费下载链接】TREKA self-hosted travel/trip planner with real-time collaboration, interactive maps, PWA support, SSO, budgets, packing lists, and more.项目地址: https://gitcode.com/GitHub_Trending/nomad22/TREKMCP Access 是 TREK 管理后台Admin Panel中用于集中管理全实例 MCP 接入凭证的核心面板管理员可以查看任意用户的 MCP OAuth 会话与长期 API 令牌并一键撤销、删除。本文以 wiki/Admin-MCP-Tokens.md 为骨架结合 server/src/nest/admin/admin.controller.ts、server/src/services/adminService.ts、server/src/services/authService.ts 等源码讲清两类凭证的差异、表格字段含义、操作背后的失效机制以及trekoa_/trek_两种令牌前缀的来源。MCP Access 面板全实例 MCP 凭证总览MCP Access面板对应前端组件 client/src/components/Admin/AdminMcpTokensPanel.tsx展示的是全实例范围内所有用户的活跃 MCP OAuth 会话与 API 令牌而普通用户在个人设置中只能看到自己的令牌。作为管理员你可以对它们执行撤销revoke和删除delete操作。该面板有两个重要的前置条件仅当 MCP addon 启用时才可见MCP 作为集成型 addon 存放在addons表中id 为mcp默认enabled 0见 server/src/db/migrations.ts需先在 Admin-Addons 面板中启用它需要管理员权限面板的读取与操作 API 都挂在 admin 命名空间下受管理后台鉴权保护。从源码看面板背后是 4 个管理端接口见 server/src/nest/admin/admin.controller.tsHTTP 接口方法作用/admin/mcp-tokensGET列出所有用户的 MCP API 令牌/admin/mcp-tokens/:idDELETE删除指定 MCP API 令牌/admin/oauth-sessionsGET列出所有活跃的 OAuth 会话/admin/oauth-sessions/:idDELETE撤销指定 OAuth 会话前端通过 client/src/api/client.ts 中的adminApi.mcpTokens()、adminApi.deleteMcpToken()、adminApi.oauthSessions()、adminApi.revokeOAuthSession()调用这些接口。面板下方分为两个区块OAuth Sessions与API Tokens二者代表 TREK 支持的两类 MCP 接入凭证。OAuth Sessions推荐的标准授权方式OAuth 会话产生于用户通过OAuth 2.1 流程授权某个 MCP 客户端接入 TREK 之时这是官方推荐、也是唯一支持细粒度权限的接入方式。授权流程速览从 server/src/mcp/oauthProvider.ts 的实现可以看到完整链路MCP 客户端通过动态客户端注册DCRRFC 7591注册自身注册时校验redirect_uris仅允许 HTTPS、loopback HTTPlocalhost / 127.0.0.1 / ::1或带点号的自定义私有 scheme并拦截javascript:、data:等危险 scheme见 oauthProvider.ts用户被重定向到 TREK 的/oauth/consent授权同意页携带client_id、redirect_uri、scope、code_challengeS256 PKCE等参数用户批准后客户端用授权码 code verifier 换取访问令牌与刷新令牌TREK 在换取令牌时写入审计日志oauth.token.issue见 oauthProvider.ts后续每次 MCP 请求携带访问令牌由verifyAccessToken解析出对应用户、客户端与授权 scope 集合见 oauthProvider.ts。表格列说明OAuth Sessions 表格各列含义如下与原文档一致列说明Client name已注册 OAuth 客户端的名称其下方以徽章badge形式展示已授予的 scope最多显示 6 个超出部分显示 N more点击可展开/收起前端常量SCOPES_PREVIEW 6见 AdminMcpTokensPanel.tsxOwner授权该会话的用户名Created会话建立日期操作垃圾桶图标按钮点击后弹出确认框用于撤销会话撤销会话及其底层联动撤销操作流程点击行内垃圾桶图标 → 确认弹窗 → 调用DELETE /admin/oauth-sessions/:id。服务端 adminService.ts 的处理是将oauth_tokens表中该记录的revoked_at置为当前时间调用revokeUserSessionsForClient(user_id, client_id)只关闭该用户与该客户端的 MCP 会话不影响该用户其他客户端的会话写入审计日志action 为admin.oauth_session.revoke见 admin.controller.ts。会话被撤销后立即失效该 MCP 客户端必须重新走一遍授权流程才能继续发请求。前缀trekoa_与令牌存储安全OAuth 访问令牌使用前缀trekoa_刷新令牌使用trekrf_前缀。生成逻辑在 server/src/services/oauthService.tstrekoa_ 32 字节加密随机数randomBytes(32)的 hex 编码。安全存储方面TREK 不落库明文令牌而是只存 SHA-256 哈希hashToken并在校验时使用常量时间比较timingSafeEqualHex防时序攻击见 oauthService.ts。oauth_tokens表对access_token_hash与refresh_token_hash均建有唯一索引见 migrations.ts。API Tokens用户的长期静态令牌API 令牌MCP tokens是用户在个人设置中自行创建的长期令牌适合脚本化或 CLI 类客户端直接以 Bearer 方式携带不需要走浏览器授权流程。它们以trek_前缀标识。表格列说明列说明Token name用户为令牌起的标签下方以等宽字体显示其截断前缀如trek_ab12c...Owner创建该令牌的用户名Created令牌创建日期Last used最近一次使用该令牌发起 API 调用的日期从未使用过则显示 Never操作垃圾桶图标按钮点击后弹出确认框用于删除令牌令牌的创建与限制源码级用户在个人设置Integrations 页创建令牌时服务端 authService.ts 施加以下规则命名必填且不超过 100 字符每用户最多 10 个令牌超出返回 400 错误原始令牌为trek_ 24 字节加密随机的 hex 编码数据库仅保存 SHA-256 哈希与前 13 个字符的前缀rawToken.slice(0, 13)用于界面展示与识别原始令牌仅在创建响应中返回一次raw_token字段之后无法再查看。表结构与唯一索引见 migrations.tsmcp_tokens表含user_id级联删除、name、token_hash、token_prefix、created_at、last_used_at。删除令牌删除操作点击垃圾桶图标 → 确认 → 调用DELETE /admin/mcp-tokens/:id。服务端 adminService.ts 的处理是校验令牌存在不存在返回 404从mcp_tokens表物理删除该记录调用revokeUserSessions(token.user_id)终止该用户的全部活跃 MCP 会话注意这里比 OAuth 撤销更彻底是所有会话而不限于某个客户端。令牌一旦删除立即失效。如果用户仍需访问必须回到个人设置中重新创建一个新令牌。令牌验证与 Last used 更新每当一个trek_令牌被用于 MCP 请求服务端通过 verifyMcpToken 完成校验对传入令牌做 SHA-256 哈希后查mcp_tokens表并 JOIN 用户表命中即同步更新last_used_at失败返回 null。这正是 Last used 列的数据来源。撤销背后的会话联动机制MCP 会话即活跃的流式 HTTP 连接与令牌一一对应因此令牌撤销必须同步清理内存中的会话。这一联动由 server/src/mcp/sessionManager.ts 承担McpSession结构包含userId、scopes、clientId、isStaticToken、lastActivity等字段其中scopes为 null 表示静态trek_令牌或 JWT即全权限访问为字符串数组则表示 OAuth 2.1 授权的作用域见 sessionManager.tsrevokeUserSessions(userId)遍历并关闭该用户的所有MCP 会话——删除trek_令牌时调用revokeUserSessionsForClient(userId, clientId)只关闭特定用户 × 特定 OAuth 客户端组合的会话——撤销 OAuth 会话时调用避免误伤该用户其他客户端evictOldestSessionForUser按lastActivity淘汰最久未使用的会话保证单用户会话数有上限时不会因客户端丢失Mcp-Session-Id而彻底锁死集成见 sessionManager.ts。同时值得注意的是静态trek_令牌在 scopes.ts 中被明确定义为null scopes static trek_ token full access即拥有完整权限而 OAuth 会话的权限则受用户在同意页授予的 scope 约束。这也是文档推荐优先使用 OAuth 方式接入的原因——它支持最小权限授权而静态令牌是一刀切的全权限凭证。相关页面MCP-OverviewMCP 整体架构与接入概念MCP-Setup客户端接入配置OAuth / 静态令牌两种方式Admin-Panel-Overview管理后台各面板总览Admin-Addons启用 MCP addon 的入口面板可见前提【免费下载链接】TREKA self-hosted travel/trip planner with real-time collaboration, interactive maps, PWA support, SSO, budgets, packing lists, and more.项目地址: https://gitcode.com/GitHub_Trending/nomad22/TREK创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考 SEO 优化官网定制响应式建站教育培训建站