Middleware
Middleware adalah fungsi yang dijalankan sebelum handler utama — biasanya untuk autentikasi, logging, atau pembatasan akses.
Middleware Bawaan
app/middleware/auth.ns
// wajib_login(req) — verifikasi token JWT, kembalikan klaim atau nihil
fungsi wajib_login(req) {
buat auth = header_req(req, "Authorization")
jika auth == "" { kembalikan nihil }
// Hapus prefix "Bearer "
buat token = auth
jika muat(auth, "Bearer ") { token = potong(auth, 7) }
buat klaim = jwt_verifikasi(token, RAHASIA_JWT)
kembalikan klaim
}
// wajib_admin(req) — verifikasi token DAN peran admin
fungsi wajib_admin(req) {
buat klaim = wajib_login(req)
jika klaim == nihil { kembalikan nihil }
jika ambil(klaim, "peran") != "admin" { kembalikan nihil }
kembalikan klaim
}
// buat_token_pengguna(user) — buat JWT token
fungsi buat_token_pengguna(user) {
kembalikan jwt_buat({
"id" : ambil(user, "id"),
"email" : ambil(user, "email"),
"nama" : ambil(user, "nama"),
"peran" : ambil(user, "peran")
}, RAHASIA_JWT, EXPIRE_JWT)
}
Cara Menggunakan di Kontroler
Contoh Penggunaan
// Rute butuh login (pengguna biasa)
fungsi aksi_profil(req) {
buat klaim = wajib_login(req)
jika klaim == nihil {
kembalikan resp_error("Token tidak valid atau tidak ada")
}
// klaim berisi: id, email, nama, peran
kembalikan resp_ok(klaim, "Profil berhasil diambil")
}
// Rute butuh admin
fungsi aksi_hapus_pengguna(req) {
buat klaim = wajib_admin(req)
jika klaim == nihil {
kembalikan resp_error("Hanya admin yang bisa mengakses ini")
}
// Lanjutkan proses...
}
Membuat Middleware Kustom
Contoh: Rate Limiter Sederhana
// app/middleware/ratelimit.ns
buat hitungan_ip = {}
fungsi batasi_request(req, maks_per_menit) {
buat ip = header_req(req, "X-Forwarded-For")
jika ip == "" { ip = "127.0.0.1" }
buat sekarang = waktu_sekarang()
buat kunci_ip = ip + "_" + format_waktu(sekarang, "2006-01-02T15:04")
buat hitungan = ambil(hitungan_ip, kunci_ip)
jika hitungan == nihil { hitungan = 0 }
jika hitungan >= maks_per_menit {
kembalikan salah // tolak
}
hitungan_ip = atur(hitungan_ip, kunci_ip, hitungan + 1)
kembalikan benar // izinkan
}
// Gunakan di kontroler:
// jika !batasi_request(req, 60) {
// kembalikan resp_error("Terlalu banyak request")
// }