@swalest/ws-auth v2.4.4
NestJS JWT Authentication Package with WebSocket Support
š”ļø Overview
This package provides a secure and scalable JWT authentication system for NestJS, including HTTP and WebSocket authentication guards.
It supports:
ā
JWT authentication with @nestjs/jwt
ā
WebSocket authentication via WsAuthGuard
ā
Token validation and error handling
ā
User injection into WebSocket clients
š¦ Installation
Install the package using npm or yarn:
npm install @swalest/ws-auth
# or
yarn add @swalest/ws-auth
š Usage 1ļøā£ Import AuthModule into your application
import { Module } from '@nestjs/common';
import { AuthModule } from '@swalest/ws-auth';
@Module({
imports: [AuthModule],
})
export class AppModule {}
2ļøā£ Protect WebSocket connections with WsAuthGuard
import {
WebSocketGateway,
OnGatewayConnection,
ConnectedSocket,
UseGuards,
} from '@nestjs/websockets';
import { Socket } from 'socket.io';
import { WsAuthGuard, AuthService } from '@swalest/ws-auth';
@WebSocketGateway()
export class ChatGateway implements OnGatewayConnection {
constructor(private readonly authService: AuthService) {}
@UseGuards(WsAuthGuard)
handleConnection(@ConnectedSocket() socket: Socket) {
try {
const user = this.authService.getUserFromSocket(socket);
console.log('User connected:', user);
} catch (error) {
socket.emit('error', { message: error.message });
socket.disconnect();
}
}
}
3ļøā£ Extract the authenticated user in WebSocket
Once authenticated, the user is attached to the socket and can be accessed in your WebSocket handlers:
@UseGuards(WsAuthGuard)
handleMessage(@ConnectedSocket() socket: Socket, data: any) {
console.log('Authenticated user:', (socket as any).user);
}
š Authentication Service
You can manually validate tokens using the AuthService:
import { AuthService } from '@swalest/ws-auth';
constructor(private readonly authService: AuthService) {}
const user = this.authService.validateToken(jwtToken);
console.log('Decoded user:', user);
š Configuration
This package uses environment variables for JWT settings. Add the following to your .env file:
JWT_SECRET=mySuperSecretKey
JWT_EXPIRES_IN=1h
Alternatively, configure it in AuthModule:
JwtModule.register({
secret: process.env.JWT_SECRET || 'secret',
signOptions: { expiresIn: process.env.JWT_EXPIRES_IN || '1h' },
});
š ļø Error Handling
If the authentication fails:
The WebSocket client is disconnected
An exception event is emitted:
socket.emit('Exception', { code: 403, message: 'Invalid token' });
š License
This project is licensed under the MIT License. See the LICENSE file for details. š¤ Contributing
We welcome contributions! Feel free to submit pull requests or open issues.