Chuyển đến nội dung chính

第 4 課:使用 Hono 的 API 閘道 — 路由、中介軟體、驗證

使用 Hono 建構 HTTP 伺服器:路由、中間件鏈、CORS、速率限制。 JWT 身份驗證、密碼雜湊、OAuth2 流程。請求驗證和錯誤處理。

🧠 人工智慧與機器學習 — 第 3 課 第 4 課:使用 Hono 的 API 閘道 — 路由、 中介軟體、授權

從零開始搭建AI代理平台-與xClaw實戰

第 1 部分:Monorepo 架構與平台

亞洲開發網

簡介

Hono 是一個在 Web 標準 API 上運行的輕量級 HTTP 框架 — 快速、輕巧且類型安全。 xClaw 使用 Hono 作為 API 閘道-所有 HTTP 請求的入口點。


1.Hono伺服器設置

// packages/gateway/src/gateway.ts
import { Hono } from 'hono';
import { cors } from 'hono/cors';
import { logger } from 'hono/logger';

export function createGateway() {
  const app = new Hono();

  // Global middleware
  app.use('*', logger());
  app.use('*', cors({
    origin: process.env.CORS_ORIGINS?.split(',') ?? ['http://localhost:3001'],
    credentials: true,
  }));

  // Health check
  app.get('/health', (c) => {
    return c.json({
      status: 'ok',
      uptime: process.uptime(),
      timestamp: new Date().toISOString(),
    });
  });

  // Auth routes (public)
  app.post('/auth/login', loginHandler);
  app.post('/auth/register', registerHandler);

  // Protected API routes
  const api = new Hono();
  api.use('*', authMiddleware);   // JWT verification
  api.use('*', rbacMiddleware);   // Permission checking

  api.post('/chat', chatHandler);
  api.get('/models', modelsHandler);
  api.route('/workflows', workflowRoutes);
  api.route('/knowledge', knowledgeRoutes);
  api.route('/monitoring', monitoringRoutes);

  app.route('/api', api);
  return app;
}

2.JWT認證

// packages/gateway/src/auth.ts
import { sign, verify } from 'hono/jwt';
import { compare, hash } from 'bcrypt';

async function loginHandler(c: Context) {
  const { email, password } = await c.req.json();

  const user = await findUserByEmail(email);
  if (!user) return c.json({ error: 'Invalid credentials' }, 401);

  const valid = await compare(password, user.passwordHash);
  if (!valid) return c.json({ error: 'Invalid credentials' }, 401);

  const token = await sign(
    { sub: user.id, tenantId: user.tenantId, email: user.email },
    process.env.JWT_SECRET!,
  );

  return c.json({ token, user: { id: user.id, name: user.name, email: user.email } });
}

// Auth middleware
async function authMiddleware(c: Context, next: Next) {
  const header = c.req.header('Authorization');
  if (!header?.startsWith('Bearer ')) {
    return c.json({ error: 'Unauthorized' }, 401);
  }

  const token = header.slice(7);
  const payload = await verify(token, process.env.JWT_SECRET!);
  c.set('user', payload);
  await next();
}

3. RBAC 中介軟體

function requirePermission(...permissions: string[]) {
  return async (c: Context, next: Next) => {
    const user = c.get('user');
    const userPerms = await getUserPermissions(user.sub, user.tenantId);

    for (const perm of permissions) {
      if (!userPerms.includes(perm)) {
        return c.json({ error: 'Forbidden', required: perm }, 403);
      }
    }

    await next();
  };
}

// Usage
api.post('/workflows', requirePermission('workflows:create'), createWorkflowHandler);
api.delete('/workflows/:id', requirePermission('workflows:delete'), deleteWorkflowHandler);

4. 總結

  • Hono — 輕量級、Web 標準、中介軟體鏈
  • JWT auth — 無狀態身份驗證
  • RBAC 中介軟體 — 每個路由基於權限的存取控制
  • 錯誤處理 — 一致的 JSON 錯誤回應

下一篇文章: LLM 路由器 - 多提供者 LLM 的適配器模式。