feat: integrate authentication and password management features, including bcrypt for hashing and NextAuth for session handling
This commit is contained in:
82
services/auth.service.ts
Normal file
82
services/auth.service.ts
Normal file
@@ -0,0 +1,82 @@
|
||||
import { promises as fs } from "fs";
|
||||
import path from "path";
|
||||
import { existsSync } from "fs";
|
||||
import bcrypt from "bcryptjs";
|
||||
|
||||
const PASSWORD_FILE = path.join(process.cwd(), "prisma", "password.json");
|
||||
|
||||
interface PasswordData {
|
||||
hash: string;
|
||||
createdAt: string;
|
||||
updatedAt: string;
|
||||
}
|
||||
|
||||
async function ensurePasswordFile(): Promise<void> {
|
||||
if (!existsSync(PASSWORD_FILE)) {
|
||||
// Create default password "admin" if file doesn't exist
|
||||
const defaultHash = await bcrypt.hash("admin", 10);
|
||||
const defaultData: PasswordData = {
|
||||
hash: defaultHash,
|
||||
createdAt: new Date().toISOString(),
|
||||
updatedAt: new Date().toISOString(),
|
||||
};
|
||||
await fs.writeFile(PASSWORD_FILE, JSON.stringify(defaultData, null, 2), "utf-8");
|
||||
}
|
||||
}
|
||||
|
||||
async function loadPasswordData(): Promise<PasswordData> {
|
||||
await ensurePasswordFile();
|
||||
const content = await fs.readFile(PASSWORD_FILE, "utf-8");
|
||||
return JSON.parse(content);
|
||||
}
|
||||
|
||||
async function savePasswordData(data: PasswordData): Promise<void> {
|
||||
await fs.writeFile(PASSWORD_FILE, JSON.stringify(data, null, 2), "utf-8");
|
||||
}
|
||||
|
||||
export const authService = {
|
||||
async verifyPassword(password: string): Promise<boolean> {
|
||||
try {
|
||||
const data = await loadPasswordData();
|
||||
return await bcrypt.compare(password, data.hash);
|
||||
} catch (error) {
|
||||
console.error("Error verifying password:", error);
|
||||
return false;
|
||||
}
|
||||
},
|
||||
|
||||
async changePassword(oldPassword: string, newPassword: string): Promise<{ success: boolean; error?: string }> {
|
||||
try {
|
||||
// Verify old password
|
||||
const isValid = await this.verifyPassword(oldPassword);
|
||||
if (!isValid) {
|
||||
return { success: false, error: "Mot de passe actuel incorrect" };
|
||||
}
|
||||
|
||||
// Hash new password
|
||||
const newHash = await bcrypt.hash(newPassword, 10);
|
||||
const data = await loadPasswordData();
|
||||
|
||||
// Update password
|
||||
data.hash = newHash;
|
||||
data.updatedAt = new Date().toISOString();
|
||||
|
||||
await savePasswordData(data);
|
||||
|
||||
return { success: true };
|
||||
} catch (error) {
|
||||
console.error("Error changing password:", error);
|
||||
return { success: false, error: "Erreur lors du changement de mot de passe" };
|
||||
}
|
||||
},
|
||||
|
||||
async hasPassword(): Promise<boolean> {
|
||||
try {
|
||||
await ensurePasswordFile();
|
||||
return existsSync(PASSWORD_FILE);
|
||||
} catch {
|
||||
return false;
|
||||
}
|
||||
},
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user