Ver Fonte

♻️ refactor(socket): 重构Socket认证中间件

- 引入AuthService统一处理token验证,与HTTP API保持一致
- 修改token查询参数名为socket_token,避免命名冲突
- 添加调试日志打印socket握手信息
- 优化错误类型判断逻辑,统一捕获JWT相关错误
- 调整用户ID字段从userId改为id,与AuthService返回格式匹配
yourname há 5 meses atrás
pai
commit
40159aa005
1 ficheiros alterados com 11 adições e 9 exclusões
  1. 11 9
      src/server/socket/middleware/auth.middleware.ts

+ 11 - 9
src/server/socket/middleware/auth.middleware.ts

@@ -1,9 +1,9 @@
 import { Socket } from 'socket.io';
-import jwt from 'jsonwebtoken';
 import { UserService } from '@/server/modules/users/user.service';
 import { AppDataSource } from '@/server/data-source';
 import debug from 'debug';
 import { UserEntity } from '@/server/modules/users/user.entity';
+import { AuthService } from '@/server/modules/auth/auth.service';
 
 const log = debug('socket:auth');
 
@@ -15,20 +15,21 @@ export const createSocketAuthMiddleware = () => {
   return async (socket: AuthenticatedSocket, next: (err?: Error) => void) => {
     try {
       // 获取 token
-      const token = socket.handshake.auth?.token || socket.handshake.query?.token;
+      console.log('socket.handshake',socket.handshake)
+      const token = socket.handshake.auth?.token || socket.handshake.query?.socket_token;
       
       if (!token) {
         log('未提供token,拒绝连接');
         return next(new Error('未授权'));
       }
 
-      // 验证 token
-      const jwtSecret = process.env.JWT_SECRET || 'your-jwt-secret-key';
-      const decoded = jwt.verify(token as string, jwtSecret) as { userId: number };
-
-      // 获取用户服务
+      // 使用 AuthService 统一验证 token - 与 HTTP API 保持一致
       const userService = new UserService(AppDataSource);
-      const user = await userService.getUserById(decoded.userId);
+      const authService = new AuthService(userService);
+      const decoded = authService.verifyToken(token as string);
+
+      // 获取用户信息
+      const user = await userService.getUserById(decoded.id);
 
       if (!user) {
         log('无效用户,拒绝连接');
@@ -54,7 +55,8 @@ export const createSocketAuthMiddleware = () => {
     } catch (error) {
       log('认证错误:', error);
       
-      if (error instanceof jwt.JsonWebTokenError) {
+      const err = error as Error;
+      if (err.name === 'JsonWebTokenError' || err.name === 'TokenExpiredError') {
         return next(new Error('无效的token'));
       }