auth.middleware.mt.ts 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. import { Context, Next } from 'hono';
  2. import { AuthService } from '../services/index.mt';
  3. import { UserServiceMt } from '../../../user-module-mt/src/services/index.mt';
  4. import { AppDataSource } from '@d8d/shared-utils';
  5. import { AuthContext } from '@d8d/shared-types';
  6. import { parseWithAwait } from '@d8d/shared-utils';
  7. import { UserResponseSchemaMt } from '../../../user-module-mt/src/schemas/index.mt';
  8. export async function authMiddleware(c: Context<AuthContext>, next: Next) {
  9. try {
  10. const authHeader = c.req.header('Authorization');
  11. if (!authHeader) {
  12. return c.json({ message: 'Authorization header missing' }, 401);
  13. }
  14. const tokenParts = authHeader.split(' ');
  15. if (tokenParts.length !== 2 || tokenParts[0] !== 'Bearer') {
  16. return c.json({ message: 'Authorization header missing' }, 401);
  17. }
  18. const token = tokenParts[1];
  19. if (!token) {
  20. return c.json({ message: 'Token missing' }, 401);
  21. }
  22. const userService = new UserServiceMt(AppDataSource);
  23. const authService = new AuthService(userService);
  24. const decoded = authService.verifyToken(token);
  25. // 从token中提取租户ID(如果存在)
  26. const tenantId = decoded.tenantId;
  27. const user = await userService.getUserById(decoded.id, tenantId);
  28. if (!user) {
  29. return c.json({ message: 'User not found' }, 401);
  30. }
  31. // 设置用户上下文
  32. const userData = await parseWithAwait(UserResponseSchemaMt, user);
  33. c.set('user', userData);
  34. c.set('token', token);
  35. // 设置租户上下文(从用户信息中提取租户ID)
  36. if (user.tenantId) {
  37. c.set('tenantId', user.tenantId);
  38. }
  39. await next();
  40. } catch (error) {
  41. console.error('Authentication error:', error);
  42. return c.json({ message: 'Invalid token' }, 401);
  43. }
  44. }