fix: middleware 移除 better-sqlite3 依赖,修复 Edge Runtime 报错

middleware 运行在 Edge Runtime,不支持 Node.js 原生模块。
API Key 验证回归 ALLOWED_API_KEYS 环境变量检查,DB 验证由 route handler 负责。
This commit is contained in:
gitadmin 2026-05-15 09:26:25 +08:00
parent 69694d3fe9
commit 3f3dfc1f19
2 changed files with 6 additions and 15 deletions

View File

@ -136,7 +136,7 @@ npm run import # 导入设备数据
- **Web UIv2.1**`middleware.ts` 优先检查 `tlyq_session`(共享 JWTOA 统一签发)→ 回退 `session_assets`(本地 JWT。`getSession()` 每次请求时检查 LLDAP 用户是否存在,已删除则清除 cookie 踢出 - **Web UIv2.1**`middleware.ts` 优先检查 `tlyq_session`(共享 JWTOA 统一签发)→ 回退 `session_assets`(本地 JWT。`getSession()` 每次请求时检查 LLDAP 用户是否存在,已删除则清除 cookie 踢出
- **localadmin**:纯本地 BCrypt 认证,不依赖 LLDAP用于 LLDAP 故障时应急登录DB 预置admin 角色) - **localadmin**:纯本地 BCrypt 认证,不依赖 LLDAP用于 LLDAP 故障时应急登录DB 预置admin 角色)
- **API Keyv2.2**`middleware.ts` 采用两级验证:① `ALLOWED_API_KEYS` 环境变量快速匹配(逗号分隔明文 key② 未命中则查 `api_keys` 数据库表SHA-256 hash。无效 key 在中间件层直接返回 401此前仅检查 `Bearer ak_` 前缀就放行,实际验证延后到 route handler。外部系统如 issue-ai调用本系统 API 时key 可注册在 `ALLOWED_API_KEYS``api_keys` 表中任意一处即可 - **API Keyv2.2**`middleware.ts` 检查 `ALLOWED_API_KEYS` 环境变量(逗号分隔明文 key无效 key 在中间件层直接返回 401。注意middleware 运行在 Edge Runtime不能使用 `better-sqlite3`DB 级别的 key 验证由 route handler 中的 `auth.ts verifyApiKey()` 进行(查 `api_keys` 表 SHA-256 hash支持 `last_used_at` 追踪和 permissions 控制)。外部系统调用本系统 API 时key 必须注册在 `ALLOWED_API_KEYS`
--- ---

View File

@ -1,23 +1,14 @@
import { NextResponse } from 'next/server' import { NextResponse } from 'next/server'
import type { NextRequest } from 'next/server' import type { NextRequest } from 'next/server'
import crypto from 'crypto'
import db from '@/lib/db'
// API Key 验证ALLOWED_API_KEYS 环境变量(快速路径)→ api_keys 数据库表(回退) // API Key 验证:检查 ALLOWED_API_KEYS 环境变量(逗号分隔明文 key
// 注意middleware 运行在 Edge Runtime不能使用 better-sqlite3 等 Node.js 原生模块
// DB 级别的 key 验证在 route handler 中进行auth.ts verifyApiKey
function verifyApiKey(key: string): boolean { function verifyApiKey(key: string): boolean {
if (!key.startsWith('ak_')) return false if (!key.startsWith('ak_')) return false
// 1. 快速路径ALLOWED_API_KEYS 环境变量
const allowedKeys = process.env.ALLOWED_API_KEYS || '' const allowedKeys = process.env.ALLOWED_API_KEYS || ''
if (allowedKeys && allowedKeys.split(',').map(k => k.trim()).includes(key)) { if (!allowedKeys) return false
return true return allowedKeys.split(',').map(k => k.trim()).includes(key)
}
// 2. 回退:查 api_keys 数据库表
try {
const keyHash = crypto.createHash('sha256').update(key).digest('hex')
const row = db.prepare('SELECT id FROM api_keys WHERE key_hash = ? AND is_active = 1').get(keyHash)
if (row) return true
} catch { /* DB 不可用时忽略 */ }
return false
} }
function decodeJwtPayload(token: string): Record<string, unknown> | null { function decodeJwtPayload(token: string): Record<string, unknown> | null {