File size: 1,128 Bytes
00a912e | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | import type { TypedServer, TypedSocket } from './types.js'
import { getIdentityFromCookieHeader } from '../services/identityService.js'
import { logger } from '../utils/logger.js'
import { userRepo } from '../repositories/userRepository.js'
/**
* Socket identity guard: every websocket connection must carry a valid
* mt_identity cookie signed by the server.
*/
export function attachSocketIdentity(io: TypedServer): void {
io.use((socket, next) => {
const cookieHeader = socket.handshake.headers.cookie
const identity = getIdentityFromCookieHeader(typeof cookieHeader === 'string' ? cookieHeader : undefined)
if (!identity) {
logger.warn('Socket identity verification failed', {
socketId: socket.id,
hasCookieHeader: Boolean(cookieHeader),
origin: socket.handshake.headers.origin ?? null,
})
next(new Error('UNAUTHENTICATED'))
return
}
userRepo.touch(identity.userId)
socket.data.identityUserId = identity.userId
logger.debug('实时连接身份验证通过', {
socketId: socket.id,
userId: identity.userId,
})
next()
})
}
|