Files
2025-05-15 08:40:09 +00:00

82 lines
2.2 KiB
TypeScript

import { Hono } from 'hono'
import { cors } from 'hono/cors'
import type { Context as HonoContext } from 'hono'
import { Auth } from '@d8d-appcontainer/auth'
import type { User as AuthUser } from '@d8d-appcontainer/auth'
import { APIClient } from '@d8d-appcontainer/api'
import type { SystemSettingRecord } from '../client/share/types.ts'
import debug from "debug"
const log = {
auth: debug('auth:server')
}
// 定义自定义上下文类型
export interface Variables {
auth: Auth
user?: AuthUser
apiClient: APIClient
moduleDir: string
systemSettings?: SystemSettingRecord
}
// 认证中间件
export const withAuth = async (c: HonoContext<{ Variables: Variables }>, next: () => Promise<void>) => {
try {
const auth = c.get('auth')
const token = c.req.header('Authorization')?.replace('Bearer ', '')
if (token) {
const userData = await auth.verifyToken(token)
if (userData) {
c.set('user', userData)
await next()
return
}
}
return c.json({ error: '未授权' }, 401)
} catch (error) {
log.auth('认证失败:', error)
return c.json({ error: '无效凭证' }, 401)
}
}
// 导出withAuth类型定义
export type WithAuth = typeof withAuth;
// 环境变量设置中间件
export const setEnvVariables = (apiClient: APIClient, moduleDir: string, auth: Auth) => {
return async (c: HonoContext<{ Variables: Variables }>, next: () => Promise<void>) => {
c.set('apiClient', apiClient)
c.set('moduleDir', moduleDir)
c.set('auth', auth)
c.set('systemSettings', await initSystemSettings(apiClient))
await next()
}
}
// CORS中间件
export const corsMiddleware = cors()
// 初始化系统设置
const initSystemSettings = async (apiClient: APIClient) => {
try {
const systemSettings = await apiClient.database.table('system_settings')
.select()
// 将系统设置转换为键值对形式
const settings = systemSettings.reduce((acc: Record<string, any>, setting: any) => {
acc[setting.key] = setting.value
return acc
}, {}) as SystemSettingRecord
return settings
} catch (error) {
log.auth('获取系统设置失败:', error)
return {} as SystemSettingRecord
}
}