A full-stack authentication system built with NestJS (backend) and Next.js (frontend) featuring JWT authentication, session management, and multi-device support.
Backend:
- NestJS 11
- PostgreSQL
- TypeORM
- JWT Authentication
- bcryptjs
- Swagger API Documentation
Frontend:
- Next.js 15
- React 19
- TanStack Query
- Shadcn UI
- Tailwind CSS
- Zod Validation
- ✅ User Registration & Login
- ✅ JWT Access & Refresh Tokens
- ✅ HttpOnly Cookie-based Authentication
- ✅ Multi-device Session Management (Max 3 devices)
- ✅ Token Blacklisting
- ✅ Account Lockout (5 failed attempts, 15 min duration)
- ✅ Device Tracking (IP, User-Agent, Platform)
- ✅ Session Revocation (single & all devices)
- ✅ Automatic Session Cleanup (Cron Jobs)
- ✅ Environment Validation
- ✅ Full TypeScript Support
- ✅ Swagger API Documentation
- Node.js 20+
- PostgreSQL 14+
- pnpm (recommended) or npm
cd backendpnpm installCreate a .env file:
DB_HOST=localhost
DB_PORT=5432
DB_USERNAME=postgres
DB_PASSWORD=your_password
DB_NAME=mutual_funds_loan
JWT_SECRET=your-super-secret-jwt-key-at-least-32-characters-long
JWT_EXPIRATION=1h
JWT_REFRESH_EXPIRATION=7d
MAX_LOGIN_ATTEMPTS=5
LOGIN_BLOCK_DURATION=900
PORT=8000
NODE_ENV=developmentpsql -U postgres
CREATE DATABASE mutual_funds_loan;
\qpnpm run migration:run# Development mode
pnpm run start:dev
# Production mode
pnpm run build
pnpm run start:prodBackend will be running at: http://localhost:8000
Swagger Documentation: http://localhost:8000/api/docs
cd frontendpnpm installpnpm run devFrontend will be running at: http://localhost:3000
POST /auth/register- Register new userPOST /auth/login- Login userPOST /auth/logout- Logout current sessionPOST /auth/logout-all- Logout from all devicesPOST /auth/refresh- Refresh access tokenGET /auth/profile- Get user profile (protected)
GET /auth/sessions- Get active sessions (protected)DELETE /auth/sessions/:id- Revoke specific session (protected)POST /auth/cleanup/manual- Manual cleanup (protected)
- id, email, password, firstName, lastName, phone, panNumber
- isActive, loginAttempts, lockedUntil, lastLoginAt
- createdAt, updatedAt
- id, userId, sessionToken, refreshToken
- deviceInfo (JSON), ipAddress, userAgent
- isActive, expiresAt, lastAccessedAt, createdAt
- id, token, tokenType, reason, expiresAt, createdAt
- Password Hashing: bcrypt with 12 salt rounds
- JWT Tokens: Secure access & refresh tokens
- HttpOnly Cookies: Prevents XSS attacks
- Token Blacklisting: Invalidates revoked tokens
- Account Lockout: 5 failed attempts = 15 min lockout
- Session Limits: Max 3 concurrent sessions per user
- Automatic Cleanup: Cron jobs remove expired tokens/sessions
- Environment Validation: Ensures required config exists
- Every Hour: Cleanup expired blacklisted tokens
- Every 6 Hours: Cleanup expired sessions
- Daily (Midnight): Full cleanup of both tokens and sessions
- Start the backend server
- Navigate to http://localhost:8000/api/docs
- Register a new user via
/auth/register - Login via
/auth/loginto get tokens - Click "Authorize" and enter the access token
- Test protected endpoints
pnpm run build # Build for production
pnpm run format # Format code with Prettier
pnpm run lint # Lint code with ESLint
pnpm run migration:generate # Generate new migration
pnpm run migration:revert # Revert last migrationpnpm run build # Build for production
pnpm run start # Start production server
pnpm run lint # Check code with Biome
pnpm run format # Format code with Biome