fix: middleware 移除 better-sqlite3 依赖,修复 Edge Runtime 报错
middleware 运行在 Edge Runtime,不支持 Node.js 原生模块。 API Key 验证回归 ALLOWED_API_KEYS 环境变量检查,DB 验证由 route handler 负责。
This commit is contained in:
parent
dce8b0b6cc
commit
651971e0fe
|
|
@ -142,7 +142,7 @@ npm run import # 导入工单
|
||||||
|
|
||||||
- **Web UI(v2.1)**:`middleware.ts` 优先检查 `tlyq_session`(共享 JWT,OA 统一签发)→ 回退 `session_issue`(本地 JWT)。`getCurrentUser()` 每次请求时检查 LLDAP 用户是否存在,已删除则清除 cookie 踢出
|
- **Web UI(v2.1)**:`middleware.ts` 优先检查 `tlyq_session`(共享 JWT,OA 统一签发)→ 回退 `session_issue`(本地 JWT)。`getCurrentUser()` 每次请求时检查 LLDAP 用户是否存在,已删除则清除 cookie 踢出
|
||||||
- **localadmin**:纯本地 BCrypt 认证,不依赖 LLDAP,用于 LLDAP 故障时应急登录(DB 预置,admin 角色)
|
- **localadmin**:纯本地 BCrypt 认证,不依赖 LLDAP,用于 LLDAP 故障时应急登录(DB 预置,admin 角色)
|
||||||
- **API Key(v2.2)**:`middleware.ts` 采用两级验证:① `ALLOWED_API_KEYS` 环境变量快速匹配(逗号分隔明文 key);② 未命中则查 `api_keys` 数据库表(SHA-256 hash)。无效 key 在中间件层直接返回 401,不再放行到 route handler。外部系统(如 assets-ai)调用本系统 API 时,key 可注册在 `ALLOWED_API_KEYS` 或 `api_keys` 表中任意一处即可,推荐走 Web UI 创建(写入 `api_keys` 表,支持权限控制和 `last_used_at` 追踪)
|
- **API Key(v2.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)。外部系统调用本系统 API 时,key 必须注册在 `ALLOWED_API_KEYS` 中(Web UI 创建的 key 还需同步到环境变量,重启容器后生效)
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,4 @@
|
||||||
import { NextRequest, NextResponse } from 'next/server'
|
import { NextRequest, NextResponse } from 'next/server'
|
||||||
import crypto from 'crypto'
|
|
||||||
import { getDb } from '@/lib/db'
|
|
||||||
|
|
||||||
function decodeJwtPayload(token: string): Record<string, unknown> | null {
|
function decodeJwtPayload(token: string): Record<string, unknown> | null {
|
||||||
try {
|
try {
|
||||||
|
|
@ -17,22 +15,14 @@ function isValidPayload(payload: Record<string, unknown> | null): boolean {
|
||||||
return !(payload.exp && (payload.exp as number) < Math.floor(Date.now() / 1000))
|
return !(payload.exp && (payload.exp as number) < Math.floor(Date.now() / 1000))
|
||||||
}
|
}
|
||||||
|
|
||||||
// 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 数据库表(SHA-256 hash)
|
|
||||||
try {
|
|
||||||
const db = getDb()
|
|
||||||
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 不可用时忽略,走后续 cookie 认证 */ }
|
|
||||||
return false
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function buildLoginRedirect(request: NextRequest) {
|
function buildLoginRedirect(request: NextRequest) {
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue