Sitemap
Muh. Alif Anhar

Muh. Alif Anhar

Founder ZeeTech IT Solution & ZeeTech Academy, passionate in web development and teaching at Telkom High School

Belajar Authentication & Authorization Dasar di Express.js (bcrypt & JWT)

7 min readJan 22, 2026

--

Press enter or click to view image in full size

Pada modul sebelumnya, kita telah berhasil membuat CRUD database MySQL menggunakan Express.js. Namun, backend yang baik tidak cukup hanya CRUD.

Bayangkan jika:

  • Semua orang bisa mengakses API
  • Semua orang bisa menghapus data
  • Tidak ada sistem login

Maka aplikasi tidak aman.

Oleh karena itu, pada modul ini siswa akan belajar:

  • Konsep Authentication & Authorization
  • Cara menyimpan password dengan aman menggunakan bcrypt
  • Dasar proteksi API menggunakan middleware
  • Alur login backend yang mendekati real-world backend

Modul ini adalah gerbang penting sebelum masuk ke:

  • JWT
  • Role user (admin, user)
  • REST API skala besar

Konsep Dasar (WAJIB PAHAM)

  1. Authentication
    Proses mengecek identitas pengguna
    Contoh:
  • Login dengan username & password
  • Login dengan username & password

2. Authorization
Proses menentukan hak akses
Contoh:

  • Apakah user boleh akses data?
  • Apakah user boleh hapus data?

Authentication dulu, baru Authorization

Persiapan Project
Library yang Digunakan

npm i bcrypt
npm i jsonwebtoken

Penjelasan:

  • bcrypt → mengenkripsi (hash) password
  • jsonwebtoken (JWT) → token login (akan dipakai bertahap)

Struktur Folder Project

Struktur Folder

Penjelasan Singkat

  • controller → logika bisnis
  • router → pengatur endpoint API
  • middleware → pengecekan & penjagaan request
  • config → konfigurasi database
  • server.js → file utama backend

STEP 1 — Tabel Users (Authentication)

CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(50),
password VARCHAR(255)
);

Penjelasan:

  • password panjang 255 → karena hasil hash bcrypt panjang
  • Satu user = satu akun login

STEP 2— Register User (userController.js)

File controller/userController.js

Fungsi:

  • bcrypt → mengamankan password
  • db → koneksi database
File controller/userController.js

req.body berisi data dari client (Postman / frontend)

File controller/userController.js

Validasi Input
Tujuan:

  • Mencegah data kosong
  • Backend harus tegas
Press enter or click to view image in full size
File controller/userController.js

Hash Password
Penjelasan:

  • Password asli → diubah jadi hash
  • Angka 10 = tingkat keamanan (salt rounds)

Bahkan admin tidak bisa melihat password asli

Press enter or click to view image in full size
File controller/userController.js

Simpan ke Database
? digunakan untuk:

  • Mencegah SQL Injection
  • Best practice backend

STEP 3— Routing Register (userController.js)

Press enter or click to view image in full size
File router/userRouter.js

Artinya:

  • Endpoint: POST /user/register
  • Digunakan untuk registrasi user

STEP 4— Middleware Authorization (auth.js)

File middleware/auth.js

Token akan dikirim dari client lewat Header

File middleware/auth.js

Jika:

  • Tidak ada token
  • Maka akses ditolak
File middleware/auth.js

Artinya:

  • Lanjut ke controller
  • Request diizinkan

Inilah inti Authorization

STEP 5— Proteksi Endpoint (router.js)

Press enter or click to view image in full size
File router/router.js

Tambahkan code di baris 4 untuk memanggil file auth.js yang berada di folder middleware

Press enter or click to view image in full size
File router/router.js

Makna:

  • Semua endpoint ini wajib login
  • Tanpa token → 401 Unauthorized

STEP 6— Error Handler Global (errorHandler.js)

File middleware/errorHandler.js

Keuntungan:

  • Error tidak berantakan
  • Mudah debug
  • Backend lebih profesional

STEP 7— Server Utama (server.js)

Press enter or click to view image in full size
File src/server.js

/user → Authentication

Get Muh. Alif Anhar’s stories in your inbox

Join Medium for free to get updates from this writer.

Middleware error harus di paling bawah

STEP 8— Perbaikan di Controller (basoController.js)

  1. Tampilkan seluruh data (GET Data)
File controller/basoController.js

Penjelasan:

  • tampilData adalah fungsi controller
  • Fungsi ini dipanggil saat client melakukan GET request
  • req → data dari client
  • res → respon yang dikirim ke client
  • next → meneruskan error ke middleware lain
  • async → menandakan fungsi ini memakai await
  • try digunakan untuk menangkap error
  • Jika terjadi kesalahan di dalam try, program tidak langsung crash
  • query→ Menyimpan perintah SQL
  • SELECT * → mengambil semua kolom
  • FROM product → dari tabel product
  • db.query() menjalankan perintah SQL ke MySQL
  • await → menunggu hasil dari database
  • rows → hasil data dari database (array of object)
  • res.status(200) → kode HTTP berhasil
  • json() → mengirim respon dalam bentuk JSON
  • catch akan dijalankan jika terjadi error di dalam try

Alur Kerja Fungsi Ini (Ringkas)
-
Client mengirim request GET /
-
Server menjalankan query ke database
- Data diambil dari tabel product
-
Server mengirim respon JSON
- Jika error → dikirim ke errorHandler

2. Tampilkan data sesuai Id (Get By ID)

Press enter or click to view image in full size
File controller/basoController.js

Alur Kerja Fungsi getById

  1. Client mengirim request
  • Mengakses endpoint dengan ID
    Contoh: GET /product/3

2. Server mengambil ID dari URL

  • req.params.id digunakan untuk menangkap nilai ID yang dikirim

3. Server menjalankan query ke database

  • Mencari data di tabel product berdasarkan ID tersebut

4. Cek apakah data ditemukan

  • Jika hasil query kosong → kirim respon 404 (data tidak ditemukan)

5. Jika data ada

  • Server mengirim respon 200 (berhasil) beserta data produk

6. Jika terjadi error

  • Error diteruskan ke errorHandler menggunakan next(error)
File controller/basoController.js

Alur Kerja Fungsi updateData

  1. Client mengirim request
  • Request PUT dengan ID di URL
    Contoh: PUT /product/3

2. Server mengambil ID & data

  • id diambil dari req.params
  • nama dan harga diambil dari req.body

3. Validasi data

  • Jika nama atau harga kosong → respon 400
  • Jika harga bukan angka → respon 400

4. Update data ke database

  • Server menjalankan query UPDATE berdasarkan ID

5. Kirim respon berhasil

  • Jika sukses → 200 (berhasil update data)

6. Jika terjadi error

  • Error diteruskan ke errorHandler dengan next(error)
File controller/basoController.js

Alur Kerja Fungsi deleteData

  1. Client mengirim request
  • Request DELETE dengan ID di URL
    Contoh: DELETE /product/3

2. Server mengambil ID

  • id diambil dari req.params

3. Hapus data di database

  • Server menjalankan query DELETE berdasarkan ID

4. Kirim respon berhasil

  • Jika sukses → respon berhasil delete data

5. Jika terjadi error

  • Error diteruskan ke errorHandler menggunakan next(error)

Contoh hasilnya jika menambah data di tabel User

Press enter or click to view image in full size
Menambah data di Tabel User

Proses di Backend:

  • Password di-hash menggunakan bcrypt
  • Disimpan ke tabel users
Press enter or click to view image in full size
Isi data Tabel Users

Di password di hash menggunakan bcrypt

Contoh hasilnya jika menambah data di Tabel User tetapi tidak sesuai dengan validasi

Press enter or click to view image in full size
File controller/userController.js

Di code kita menggunakan validasi untuk username dan password wajib di isi

Press enter or click to view image in full size

Jika tidak sesuai dengan validasinya maka muncul Username dan password wajib diisi

Contoh hasilnya jika mengambil seluruh data menggunakan token

Press enter or click to view image in full size

Token berfungsi sebagai tanda pengenal dan bukti akses pengguna ke server setelah login. Token = kunci masuk ke endpoint yang dilindungi (protected endpoint)

Contoh hasilnya jika mengambil seluruh data tanpa menggunakan token

Press enter or click to view image in full size

Contoh hasilnya jika menambah data di Tabel Product tetapi tidak sesuai dengan validasi

Press enter or click to view image in full size

Contoh hasilnya jika edit data di Tabel Product tetapi tidak sesuai dengan validasi

Press enter or click to view image in full size

Pada tahap ini, kita sudah melangkah jauh dari sekadar routing dasar di Express.js. Siswa tidak hanya belajar bagaimana membuat CRUD, tetapi juga mulai memahami bagaimana backend bekerja di dunia nyata.

Melalui materi ini, siswa telah mempelajari:

  • Struktur project backend yang rapi dan terorganisir
  • Pemisahan tugas antara router, controller, dan middleware
  • Cara menghubungkan Express.js dengan database MySQL
  • Validasi data agar database tetap aman
  • Hashing password menggunakan bcrypt
  • Konsep authentication dan authorization menggunakan middleware
  • Cara melindungi endpoint agar tidak bisa diakses sembarang user
  • Penanganan error secara terpusat menggunakan error handler

Semua konsep ini merupakan fondasi penting bagi seorang Backend Developer, baik untuk kebutuhan magang, project sekolah, maupun persiapan masuk ke dunia kerja.

Jika siswa sudah memahami materi ini dengan baik, maka mereka sudah siap untuk melanjutkan ke tahap berikutnya, seperti:

  • Login user dengan bcrypt.compare
  • Pembuatan dan verifikasi JWT (JSON Web Token)
  • Proteksi API berbasis token
  • Role user (admin dan user)
  • Pembuatan REST API yang lebih kompleks dan aman

Backend bukan hanya tentang “kode jalan”, tetapi tentang keamanan, struktur, dan tanggung jawab terhadap data.
Dengan memahami alur ini, siswa tidak hanya belajar Express.js, tetapi juga belajar cara berpikir sebagai Backend Developer.

--

--

Muh. Alif Anhar
Muh. Alif Anhar

Written by Muh. Alif Anhar

Founder ZeeTech IT Solution & ZeeTech Academy, passionate in web development and teaching at Telkom High School