43 lines
1.3 KiB
TypeScript
43 lines
1.3 KiB
TypeScript
// 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: "无效的访问令牌"
|
|
};
|
|
};
|