Files
project_SIG/controllers/auth_controller.js
T
2026-06-11 02:31:09 +00:00

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
};