|
@@ -1,9 +1,9 @@
|
|
|
import { Socket } from 'socket.io';
|
|
import { Socket } from 'socket.io';
|
|
|
-import jwt from 'jsonwebtoken';
|
|
|
|
|
import { UserService } from '@/server/modules/users/user.service';
|
|
import { UserService } from '@/server/modules/users/user.service';
|
|
|
import { AppDataSource } from '@/server/data-source';
|
|
import { AppDataSource } from '@/server/data-source';
|
|
|
import debug from 'debug';
|
|
import debug from 'debug';
|
|
|
import { UserEntity } from '@/server/modules/users/user.entity';
|
|
import { UserEntity } from '@/server/modules/users/user.entity';
|
|
|
|
|
+import { AuthService } from '@/server/modules/auth/auth.service';
|
|
|
|
|
|
|
|
const log = debug('socket:auth');
|
|
const log = debug('socket:auth');
|
|
|
|
|
|
|
@@ -15,20 +15,21 @@ export const createSocketAuthMiddleware = () => {
|
|
|
return async (socket: AuthenticatedSocket, next: (err?: Error) => void) => {
|
|
return async (socket: AuthenticatedSocket, next: (err?: Error) => void) => {
|
|
|
try {
|
|
try {
|
|
|
// 获取 token
|
|
// 获取 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) {
|
|
if (!token) {
|
|
|
log('未提供token,拒绝连接');
|
|
log('未提供token,拒绝连接');
|
|
|
return next(new Error('未授权'));
|
|
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 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) {
|
|
if (!user) {
|
|
|
log('无效用户,拒绝连接');
|
|
log('无效用户,拒绝连接');
|
|
@@ -54,7 +55,8 @@ export const createSocketAuthMiddleware = () => {
|
|
|
} catch (error) {
|
|
} catch (error) {
|
|
|
log('认证错误:', 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'));
|
|
return next(new Error('无效的token'));
|
|
|
}
|
|
}
|
|
|
|
|
|