- 拆分管理台入口为 App/feature/core 结构并更新样式/配置 - 规范 worker 路由/中间件/服务类型与 JSON 解析 - 同步工具链与知识库记录
37 lines
1.1 KiB
TypeScript
37 lines
1.1 KiB
TypeScript
import { createMiddleware } from "hono/factory";
|
|
import type { AppEnv } from "../env";
|
|
import { sha256Hex } from "../utils/crypto";
|
|
import { jsonError } from "../utils/http";
|
|
import { getBearerToken } from "../utils/request";
|
|
|
|
/**
|
|
* Validates admin session tokens for management APIs.
|
|
*/
|
|
export const adminAuth = createMiddleware<AppEnv>(async (c, next) => {
|
|
const token = getBearerToken(c);
|
|
if (!token) {
|
|
return jsonError(c, 401, "admin_token_required", "admin_token_required");
|
|
}
|
|
|
|
const tokenHash = await sha256Hex(token);
|
|
const session = await c.env.DB.prepare(
|
|
"SELECT id, expires_at FROM admin_sessions WHERE token_hash = ?",
|
|
)
|
|
.bind(tokenHash)
|
|
.first();
|
|
|
|
if (!session) {
|
|
return jsonError(c, 401, "invalid_admin_token", "invalid_admin_token");
|
|
}
|
|
|
|
if (new Date(String(session.expires_at)).getTime() <= Date.now()) {
|
|
await c.env.DB.prepare("DELETE FROM admin_sessions WHERE id = ?")
|
|
.bind(String(session.id))
|
|
.run();
|
|
return jsonError(c, 401, "admin_session_expired", "admin_session_expired");
|
|
}
|
|
|
|
c.set("adminSessionId", String(session.id));
|
|
await next();
|
|
});
|