Spaces:
Paused
Paused
| import { HTTPError } from 'h3'; | |
| /** | |
| * 认证中间件 - 验证 API 密钥 | |
| */ | |
| export const authMiddleware = (event) => { | |
| // 跳过健康检查的认证 | |
| if (event.path === '/health') { | |
| return; | |
| } | |
| // 只对 API 路由进行认证 | |
| if (!event.path?.startsWith('/v1/')) { | |
| return; | |
| } | |
| // 尝试多种方式获取 authorization 头 | |
| const authorization = event.headers?.authorization || | |
| event.req?.headers?.authorization || | |
| event.node?.req?.headers?.authorization; | |
| if (!authorization) { | |
| throw new HTTPError(401, 'Authorization header is required'); | |
| } | |
| // 支持 Bearer token 格式 | |
| const token = authorization.startsWith('Bearer ') | |
| ? authorization.slice(7) | |
| : authorization; | |
| if (!token) { | |
| throw new HTTPError(401, 'Invalid authorization format'); | |
| } | |
| // 验证 token(这里可以根据需要实现更复杂的验证逻辑) | |
| if (!isValidApiKey(token)) { | |
| throw new HTTPError(401, 'Invalid API key'); | |
| } | |
| // 将 API 密钥添加到事件上下文中 | |
| event.context.apiKey = token; | |
| }; | |
| /** | |
| * 验证 API 密钥 | |
| */ | |
| function isValidApiKey(apiKey) { | |
| // 简单验证:检查是否为非空字符串 | |
| // 在实际应用中,你可能需要: | |
| // 1. 检查数据库中的有效密钥 | |
| // 2. 验证密钥格式 | |
| // 3. 检查密钥权限 | |
| return typeof apiKey === 'string' && apiKey.length > 0; | |
| } | |