Autentikasi bcrypt + JWT
NusaScript mendukung hash password dengan bcrypt dan token autentikasi dengan JWT secara bawaan.
Hash Sandi — bcrypt
| Fungsi | Parameter | Keterangan |
|---|---|---|
hash_sandi(sandi) | sandi: teks | Hash password dengan bcrypt (cost 12) |
verifikasi_sandi(sandi, hash) | sandi, hash: teks | Bandingkan password dengan hash |
Contoh — Hash & Verifikasi Sandi
buat sandi_asli = "rahasia123"
// Hash sandi sebelum disimpan ke database
buat hash = hash_sandi(sandi_asli)
tampilkan("Hash:", hash)
// Verifikasi: cocokkan sandi yang diinput dengan hash
buat cocok = verifikasi_sandi("rahasia123", hash)
tampilkan("Sandi cocok:", cocok) // benar
buat salah = verifikasi_sandi("passwordSalah", hash)
tampilkan("Sandi salah:", salah) // salah
Output
Hash: $2a$12$... Sandi cocok: benar Sandi salah: salah
Jangan pernah simpan sandi dalam bentuk teks biasa di database. Selalu gunakan
hash_sandi() sebelum menyimpan.JWT Token
| Fungsi | Parameter | Keterangan |
|---|---|---|
buat_token(data, kunci) | data: peta, kunci: teks | Buat JWT token (expire 24 jam) |
verifikasi_token(token, kunci) | token, kunci: teks | Verifikasi & decode JWT. Kembalikan peta klaim atau nihil |
Contoh — Buat & Verifikasi Token
tetap KUNCI_RAHASIA = "kunci-super-aman-2026"
// Buat token setelah login berhasil
buat klaim = peta(
"id", "42",
"nama", "Budi Santoso",
"email", "budi@example.com",
"role", "admin"
)
buat token = buat_token(klaim, KUNCI_RAHASIA)
tampilkan("Token:", token)
// Verifikasi token (di endpoint berikutnya)
buat data = verifikasi_token(token, KUNCI_RAHASIA)
jika data == nihil {
tampilkan("Token tidak valid!")
} lain {
tampilkan("ID:", ambil(data, "id"))
tampilkan("Nama:", ambil(data, "nama"))
tampilkan("Role:", ambil(data, "role"))
}
Output
Token: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9... ID: 42 Nama: Budi Santoso Role: admin
Implementasi Login Lengkap
auth-api.ns — Contoh Login & Register
tetap KUNCI_JWT = "rahasia-aplikasi"
buat db = db_sambung("sqlite", "./app.db")
buat app = server_baru(8080)
// Setup tabel
db_exec(db, "CREATE TABLE IF NOT EXISTS user (
id INTEGER PRIMARY KEY AUTOINCREMENT,
nama TEXT, email TEXT UNIQUE, sandi TEXT
)")
// POST /daftar — Registrasi
rute(app, "POST", "/daftar", fungsi(req) {
buat body = dari_json(badan_req(req))
buat email = ke_teks(ambil(body, "email"))
buat sandi = ke_teks(ambil(body, "sandi"))
buat nama = ke_teks(ambil(body, "nama"))
buat hash = hash_sandi(sandi)
buat hasil = db_exec(db,
"INSERT INTO user (nama, email, sandi) VALUES (?,?,?)",
nama, email, hash)
jika ambil(hasil, "err") != nihil {
kembalikan ke_json(peta("error", "Email sudah digunakan"))
}
kembalikan ke_json(peta("pesan", "Registrasi berhasil"))
})
// POST /masuk — Login
rute(app, "POST", "/masuk", fungsi(req) {
buat body = dari_json(badan_req(req))
buat email = ke_teks(ambil(body, "email"))
buat sandi = ke_teks(ambil(body, "sandi"))
buat user = db_satu(db,
"SELECT * FROM user WHERE email = ?", email)
jika user == nihil {
kembalikan ke_json(peta("error", "Email atau sandi salah"))
}
jika tidak verifikasi_sandi(sandi, ke_teks(ambil(user, "sandi"))) {
kembalikan ke_json(peta("error", "Email atau sandi salah"))
}
buat token = buat_token(
peta("id", ke_teks(ambil(user, "id")),
"nama", ke_teks(ambil(user, "nama"))),
KUNCI_JWT)
kembalikan ke_json(peta("token", token, "nama", ambil(user, "nama")))
})
jalankan_server(app)