93 lines
3.9 KiB
JavaScript
93 lines
3.9 KiB
JavaScript
const bcrypt = require('bcrypt');
|
|
const db = require('../config/database');
|
|
|
|
// Memvalidasi kredensial login petugas lapangan menggunakan pencarian SQLite
|
|
const proses_autentikasi_petugas = (req, res) => {
|
|
const { username, password } = req.body;
|
|
|
|
// Praktik keamanan: Memblokir eksekusi lebih lanjut jika muatan data kosong untuk menghindari error sistem
|
|
if (!username || !password) {
|
|
return res.status(400).json({ error: 'Username dan kata sandi petugas wajib diisi.' });
|
|
}
|
|
|
|
const kueri_petugas = `SELECT * FROM PETUGAS WHERE username = ?`;
|
|
|
|
db.get(kueri_petugas, [username], async (error_sql, baris_petugas) => {
|
|
if (error_sql) {
|
|
console.error('Gagal query tabel PETUGAS:', error_sql.message);
|
|
return res.status(500).json({ error: 'Terjadi kegagalan sistem internal server.' });
|
|
}
|
|
|
|
// Praktik keamanan: Memberikan pesan error generik agar peretas tidak mengetahui apakah username tersebut ada di database atau tidak
|
|
if (!baris_petugas) {
|
|
return res.status(401).json({ error: 'Kredensial login tidak valid.' });
|
|
}
|
|
|
|
try {
|
|
/* Baris kompleks: Melakukan verifikasi asinkron untuk mencocokkan kata sandi teks murni dari klien
|
|
dengan nilai hash terenkripsi di database menggunakan bcrypt.compare, yang secara inheren kebal
|
|
terhadap serangan timing-attack. */
|
|
const validasi_password = await bcrypt.compare(password, baris_petugas.password);
|
|
|
|
if (!validasi_password) {
|
|
return res.status(401).json({ error: 'Kredensial login tidak valid.' });
|
|
}
|
|
|
|
res.status(200).json({
|
|
message: 'Autentikasi petugas berhasil',
|
|
token: `simulasi_jwt_token_untuk_petugas_${baris_petugas.username}`
|
|
});
|
|
|
|
} catch (error_kripto) {
|
|
console.error('Error komputasi hash:', error_kripto.message);
|
|
res.status(500).json({ error: 'Gagal memproses verifikasi keamanan.' });
|
|
}
|
|
});
|
|
};
|
|
|
|
// Memvalidasi kredensial login administrator utama menggunakan pencarian SQLite
|
|
const proses_autentikasi_admin = (req, res) => {
|
|
const { username, password } = req.body;
|
|
|
|
// Praktik keamanan: Memblokir eksekusi lebih lanjut jika muatan data kosong
|
|
if (!username || !password) {
|
|
return res.status(400).json({ error: 'Username dan kata sandi admin wajib diisi.' });
|
|
}
|
|
|
|
const kueri_admin = `SELECT * FROM ADMIN WHERE username = ?`;
|
|
|
|
// Baris kompleks: Eksekusi pencarian data dengan parameterized query (?) memastikan nilai input diperlakukan murni sebagai string data, menutup celah eksploitasi SQL Injection secara absolut.
|
|
db.get(kueri_admin, [username], async (error_sql, baris_admin) => {
|
|
if (error_sql) {
|
|
console.error('Gagal query tabel ADMIN:', error_sql.message);
|
|
return res.status(500).json({ error: 'Terjadi kegagalan sistem internal server.' });
|
|
}
|
|
|
|
if (!baris_admin) {
|
|
return res.status(401).json({ error: 'Kredensial login admin tidak valid.' });
|
|
}
|
|
|
|
try {
|
|
const validasi_password = await bcrypt.compare(password, baris_admin.password);
|
|
|
|
if (!validasi_password) {
|
|
return res.status(401).json({ error: 'Kredensial login admin tidak valid.' });
|
|
}
|
|
|
|
res.status(200).json({
|
|
message: 'Autentikasi admin berhasil',
|
|
token: `simulasi_jwt_token_untuk_admin_${baris_admin.username}`
|
|
});
|
|
|
|
} catch (error_kripto) {
|
|
console.error('Error komputasi hash admin:', error_kripto.message);
|
|
res.status(500).json({ error: 'Gagal memproses verifikasi keamanan admin.' });
|
|
}
|
|
});
|
|
};
|
|
|
|
// Mengekspor semua fungsi agar dapat diakses oleh file router
|
|
module.exports = {
|
|
proses_autentikasi_petugas,
|
|
proses_autentikasi_admin
|
|
}; |