82 lines
2.2 KiB
TypeScript
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
|
|
}
|
|
}
|