Autentikasi bcrypt + JWT

NusaScript mendukung hash password dengan bcrypt dan token autentikasi dengan JWT secara bawaan.

Hash Sandi — bcrypt

FungsiParameterKeterangan
hash_sandi(sandi)sandi: teksHash password dengan bcrypt (cost 12)
verifikasi_sandi(sandi, hash)sandi, hash: teksBandingkan 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

FungsiParameterKeterangan
buat_token(data, kunci)data: peta, kunci: teksBuat JWT token (expire 24 jam)
verifikasi_token(token, kunci)token, kunci: teksVerifikasi & 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)