// server/utils/auth.ts - OCS API 可选访问令牌校验 import { getQuery, type H3Event } from "h3"; import { serverEnv } from "~~/server/utils/env"; /** * H3 的 query 值可能是字符串、数组或 undefined * 访问令牌只接受第一个值,和多数 Web 框架读取 query 的行为保持一致 */ const firstQueryValue = (value: unknown) => { if (Array.isArray(value)) return value[0]?.toString() || ""; return value?.toString() || ""; }; /** * 校验可选访问令牌 * * - 没配置 `ACCESS_TOKEN` 时,服务保持旧 Python 项目的开放行为 * - 配置后,兼容两种传递方式:`X-Access-Token` 请求头或 `?token=...` */ export const verifyAccessToken = (event: H3Event) => { if (!serverEnv.accessToken) return true; const headerToken = event.node.req.headers["x-access-token"]?.toString(); const queryToken = firstQueryValue(getQuery(event).token); return ( headerToken === serverEnv.accessToken || queryToken === serverEnv.accessToken ); }; /** * OCS 搜索接口使用 `{ code, msg }`,而 stats/cache 使用 `{ success, message }` * 这里先返回最基础的 OCS 形状,其他接口复用其中的 msg 文案 */ export const invalidAccessTokenResponse = () => { return { code: 0, msg: "无效的访问令牌" }; };