middlewares.ts 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. import { Hono } from 'hono'
  2. import { cors } from 'hono/cors'
  3. import type { Context as HonoContext } from 'hono'
  4. import { Auth } from '@d8d-appcontainer/auth'
  5. import type { User as AuthUser } from '@d8d-appcontainer/auth'
  6. // 扩展AuthUser类型
  7. declare module '@d8d-appcontainer/auth' {
  8. interface User {
  9. id: number
  10. username: string
  11. role: 'admin' | 'student' | 'fan' | 'teacher'
  12. student_expires_at?: string | null
  13. }
  14. }
  15. import { APIClient } from '@d8d-appcontainer/api'
  16. import type { SystemSettingRecord } from '../client/share/types.ts'
  17. import debug from "debug"
  18. const log = {
  19. auth: debug('auth:server')
  20. }
  21. // 定义自定义上下文类型
  22. export interface Variables {
  23. auth: Auth
  24. user?: AuthUser
  25. apiClient: APIClient
  26. moduleDir: string
  27. systemSettings?: SystemSettingRecord
  28. }
  29. // 认证中间件
  30. export const withAuth = async (c: HonoContext<{ Variables: Variables }>, next: () => Promise<void>) => {
  31. try {
  32. const auth = c.get('auth')
  33. const token = c.req.header('Authorization')?.replace('Bearer ', '')
  34. if (token) {
  35. const userData = await auth.verifyToken(token)
  36. if (userData) {
  37. c.set('user', userData)
  38. await next()
  39. return
  40. }
  41. }
  42. return c.json({ error: '未授权' }, 401)
  43. } catch (error) {
  44. log.auth('认证失败:', error)
  45. return c.json({ error: '无效凭证' }, 401)
  46. }
  47. }
  48. // 导出withAuth类型定义
  49. export type WithAuth = typeof withAuth;
  50. // 环境变量设置中间件
  51. export const setEnvVariables = (apiClient: APIClient, moduleDir: string, auth: Auth) => {
  52. return async (c: HonoContext<{ Variables: Variables }>, next: () => Promise<void>) => {
  53. c.set('apiClient', apiClient)
  54. c.set('moduleDir', moduleDir)
  55. c.set('auth', auth)
  56. c.set('systemSettings', await initSystemSettings(apiClient))
  57. await next()
  58. }
  59. }
  60. // CORS中间件
  61. export const corsMiddleware = cors()
  62. // 初始化系统设置
  63. const initSystemSettings = async (apiClient: APIClient) => {
  64. try {
  65. const systemSettings = await apiClient.database.table('system_settings')
  66. .select()
  67. // 将系统设置转换为键值对形式
  68. const settings = systemSettings.reduce((acc: Record<string, any>, setting: any) => {
  69. acc[setting.key] = setting.value
  70. return acc
  71. }, {}) as SystemSettingRecord
  72. return settings
  73. } catch (error) {
  74. log.auth('获取系统设置失败:', error)
  75. return {} as SystemSettingRecord
  76. }
  77. }