Proyek ini adalah implementasi REST API untuk autentikasi pengguna menggunakan NestJS, Prisma, dan Docker. API ini menyediakan endpoint untuk registrasi dan login pengguna dengan keamanan yang kuat.
- Registrasi Pengguna: Endpoint untuk membuat akun pengguna baru.
- Autentikasi Pengguna: Endpoint untuk login dan menghasilkan JWT.
- Validasi Email Unik: Memastikan email yang digunakan belum terdaftar.
- Dokumentasi API: Dokumentasi Swagger yang interaktif.
- Health Check: Endpoint untuk memeriksa status aplikasi.
- Rate Limiting: Melindungi aplikasi dari abuse dengan membatasi jumlah request.
- Backend: NestJS (TypeScript)
- ORM: Prisma
- Containerization: Docker & Docker Compose
- Authentication: JWT (JSON Web Tokens)
- API Documentation: Swagger/OpenAPI
- Password Hashing: bcrypt
project-root/
├── prisma/ # Prisma schema dan migrasi
├── src/ # Source code
│ ├── auth/ # Modul untuk autentikasi
│ ├── common/ # Kode umum yang digunakan di seluruh aplikasi
│ ├── health/ # Modul untuk health check
│ ├── prisma/ # Prisma-related files
│ ├── app.module.ts # Root module
│ ├── main.ts # Entry point aplikasi
│ ├── swagger.ts # Konfigurasi Swagger
├── test/ # Unit dan integration tests
├── .dockerignore # Ignore file for Docker
├── .env # Environment variables
├── .gitignore # Ignore file for Git
├── .prettierrc # Konfigurasi Prettier
├── docker-compose.yml # Docker Compose configuration
├── Dockerfile # Dockerfile untuk aplikasi
├── eslint.config.mjs # Konfigurasi ESLint
├── nest-cli.json # Konfigurasi NestJS CLI
├── package-lock.json # Lock file untuk dependencies
├── package.json # Dependencies and scripts
├── README.md # Project documentation
├── tsconfig.build.json # Konfigurasi TypeScript untuk build
├── tsconfig.build.tsbuildinfo # Build info
├── tsconfig.json # Konfigurasi TypeScript
├── tsconfig.tsbuildinfo # Build info
- Docker dan Docker Compose terinstal.
- Node.js (v16 atau lebih baru).
git clone https://github.com/yusup-dev/auth-nestjs.git
cd auth-nestjsnpm installBuat file .env di root proyek dan tambahkan variabel berikut:
POSTGRES_USER="postgres"
POSTGRES_PASSWORD="Password123"
POSTGRES_DB="auth-db"
PORT=3000
JWT_SECRET=51310a557a282c0790012c55dbefce096a920da69ec22e6ea2fe18b7557a3a9762eeb1230738dd5664b7fb76d8473ba07454098adb2bbb8a41c7534bd6f0c103
DATABASE_URL="postgresql://${POSTGRES_USER}:${POSTGRES_PASSWORD}@localhost:5432/${POSTGRES_DB}?schema=public"docker-compose up --build Ini akan menjalankan:
- Aplikasi NestJS di port
3000. - PostgreSQL database di port
5432.
Setelah container berjalan, jalankan migrasi Prisma:
docker-compose exec app npx prisma migrate dev --name init- Aplikasi:
http://localhost:3000 - Swagger UI:
http://localhost:3000/api
http://localhost:3000
- Method:
POST - URL:
/auth/register - Request Body:
{ "username": "string2", "email": "string2@gmail.com", "password": "string" } - Response:
- 200 OK:
{ "message": "User registered successfully" } - 400 Bad Request: Jika email atau username sudah terdaftar.
{ "message": "Email already exists" } - 400 Bad Request: Jika username sudah terdaftar.
{ "message": "Username already exists" } - 500 Internal Server Error: Jika terjadi masalah pada server.
{ "message": "Internal server error, please try again later" } - 429 Too Many Requests: Jika terlalu banyak permintaan dalam waktu singkat.
{ "message": "ThrottlerException: Too Many Requests" }
- 200 OK:
- Method:
POST - URL:
/auth/login - Request Body:
{ "email": "string2@gmail.com", "password": "string" } - Response:
- 200 OK:
{ "message": "Login successfully", "user": { "id": "f1cb8cfb-75c5-436c-8beb-585cf1a2e81b", "username": "string2", "email": "string2@gmail.com" }, "access_token": "jwt_token_here" } - 400 Bad Request: Jika kredensial yang dimasukkan salah.
{ "message": "Invalid credentials" } - 404 Not Found: Jika pengguna tidak ditemukan.
{ "message": "User not found" } - 500 Internal Server Error: Jika terjadi masalah pada server.
{ "message": "Internal server error, please try again later" } - 429 Too Many Requests: Jika terlalu banyak permintaan dalam waktu singkat.
{ "message": "ThrottlerException: Too Many Requests" }
- 200 OK:
- Method:
GET - URL:
/health - Response:
- 200 OK:
{ "status": "ok", "info": { "database": { "status": "up" } }, "error": {}, "details": { "database": { "status": "up" } } } - 429 Too Many Requests: Jika terlalu banyak permintaan dalam waktu singkat.
{ "message": "ThrottlerException: Too Many Requests" }
- 200 OK:
- Response:
- 429 Too Many Requests: Jika rate limit terlampaui.
{ "statusCode": 429, "message": "ThrottlerException: Too Many Requests", "timestamp": "2025-02-02T12:56:37.077Z", "path": "/health" }
- 429 Too Many Requests: Jika rate limit terlampaui.
- Endpoint 1 (Registrasi Pengguna) memungkinkan pengguna untuk melakukan registrasi dengan email dan username yang unik. Jika email atau username sudah terdaftar, sistem akan memberikan respons 400 dengan pesan yang sesuai.
- Endpoint 2 (Login Pengguna) digunakan untuk login dengan email dan password. Jika login berhasil, server akan memberikan access_token yang dapat digunakan untuk autentikasi pada endpoint lainnya.
- Endpoint 3 (Health Check) digunakan untuk memeriksa status aplikasi dan database. Jika keduanya berjalan dengan baik, respons akan menunjukkan status "up".
- Endpoint 4 (Rate Limit) memberikan respons 429 Too Many Requests jika terlalu banyak permintaan dalam waktu singkat.
FROM node:20-alpine as builder
ENV NODE_ENV=build
USER node
WORKDIR /home/node
COPY --chown=node:node . .
RUN npm ci
RUN npx prisma generate \
&& npm run build \
&& ls -l ./dist \
&& npm prune --omit=dev
FROM node:20-alpine
ENV NODE_ENV=production
USER node
WORKDIR /home/node
COPY --from=builder --chown=node:node /home/node/package*.json ./
COPY --from=builder --chown=node:node /home/node/node_modules/ ./node_modules/
COPY --from=builder --chown=node:node /home/node/dist/ ./dist/
CMD ["node", "dist/src/main.js"]version: '3.5'
services:
postgres:
image: postgres:13
restart: always
env_file:
- .env
environment:
POSTGRES_USER: ${POSTGRES_USER}
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
POSTGRES_DB: ${POSTGRES_DB}
volumes:
- postgres-data:/var/lib/postgresql/data
ports:
- "5432:5432"
networks:
- app-network
healthcheck:
test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER} -d ${POSTGRES_DB}"]
interval: 5s
timeout: 5s
retries: 5
app:
build: .
restart: always
env_file:
- .env
environment:
DATABASE_URL: "postgresql://postgres:Password123@postgres:5432/auth-db?schema=public"
JWT_SECRET: ${JWT_SECRET}
PORT: ${PORT}
ports:
- "3000:3000"
depends_on:
postgres:
condition: service_healthy
networks:
- app-network
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:3000/health"]
interval: 30s
timeout: 10s
retries: 3
volumes:
postgres-data:
networks:
app-network:
driver: bridge| Variable | Description | Example Value |
|---|---|---|
POSTGRES_USER |
Nama pengguna untuk database PostgreSQL | postgres |
POSTGRES_PASSWORD |
Kata sandi untuk database PostgreSQL | Password123 |
POSTGRES_DB |
Nama database PostgreSQL | auth-db |
PORT |
Port untuk aplikasi | 3000 |
JWT_SECRET |
Kunci rahasia untuk penandatanganan JWT | 51310a557a282c0790012c55dbefce096a920da69ec22e6ea2fe18b7557a3a9762eeb1230738dd5664b7fb76d8473ba07454098adb2bbb8a41c7534bd6f0c103 |
DATABASE_URL |
URL untuk koneksi database PostgreSQL | postgresql://${POSTGRES_USER}:${POSTGRES_PASSWORD}@localhost:5432/${POSTGRES_DB}?schema=public |
- Development:
- Gunakan
npm run start:devuntuk hot-reload. - Jalankan migrasi Prisma dengan
npx prisma migrate dev.
- Gunakan
- Production:
- Gunakan
npm run start:produntuk menjalankan aplikasi yang sudah di-build. - Pastikan environment variables diatur dengan benar.
- Gunakan