Files
ASPIC/aspic.php
T
2026-08-28 20:47:44 +02:00

94 lines
4.2 KiB
PHP

<?php
/**
* ASPIC — API d'authentification (aspic.php, anciennement login.php —
* renommé le 21 août 2026 à la demande de Jean-Marc, purement cosmétique,
* le contenu et le comportement ne changent pas)
* ---------------------------------------------------------------------------
* Vérifie un couple identifiant/mot de passe contre ASP_Users et répond en
* JSON. Ne fait aucune gestion de compteur d'essais ni de verrouillage de
* compte : ce comportement (2 essais puis sortie, voir journal ASPIC section
* 8) est géré côté front (identification.php), application strictement
* interne, pas de mécanisme de bannissement d'IP prévu.
*
* Requête attendue : POST, corps JSON { "identifiant": "...", "motdepasse": "..." }
* (identifiant = USR_Code, 3 caractères — pas USR_Nom, voir journal section 2).
*
* Réponses :
* 200 { "success": true, "user": { "USR_Code": "...", "USR_Nom": "..." } }
* 200 { "success": false } (identifiants incorrects)
* 400 { "success": false, "error": "..." } (requête mal formée)
* 405 { "success": false, "error": "Méthode non autorisée" } (autre que POST)
* 500 { "success": false, "error": "..." } (connexion base impossible)
*
* ⚠️ Session utilisateur intégrée le 24 août 2026 (voir journal, sections 14
* et 15) : en cas d'identification réussie, une session PHP native est
* ouverte (`session_start()` + `$_SESSION['USR_Code']`), lue ensuite par
* contacts.php/professions.php/statuts.php/realisations.php pour autoriser
* leurs appels. `session_start()` doit rester la toute première instruction
* du fichier, avant tout `header()`/`echo` — sinon PHP refuse d'envoyer les
* cookies de session.
*/
session_start();
header('Content-Type: application/json; charset=utf-8');
require __DIR__ . '/db.php';
if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
http_response_code(405);
echo json_encode(['success' => false, 'error' => 'Méthode non autorisée']);
exit;
}
$data = json_decode(file_get_contents('php://input'), true);
$identifiant = isset($data['identifiant']) ? trim((string) $data['identifiant']) : '';
$motdepasse = isset($data['motdepasse']) ? (string) $data['motdepasse'] : '';
if ($identifiant === '' || $motdepasse === '') {
http_response_code(400);
echo json_encode(['success' => false, 'error' => 'Identifiant et mot de passe sont obligatoires.']);
exit;
}
try {
$pdo = getDbConnection();
} catch (PDOException $e) {
http_response_code(500);
echo json_encode(['success' => false, 'error' => 'Connexion base de données impossible']);
exit;
}
// USR_Code est un code court (3 caractères) conventionnellement saisi en
// majuscules ; comparaison insensible à la casse sur l'identifiant, comme
// dans le prototype front (voir ASPIC_ecran_identification.html,
// trouverUtilisateurDemo). Le mot de passe, lui, reste comparé strictement
// (sensible à la casse).
$stmt = $pdo->prepare('SELECT USR_Code, USR_Nom, USR_MDP FROM ASP_Users WHERE UPPER(USR_Code) = UPPER(?)');
$stmt->execute([$identifiant]);
$user = $stmt->fetch();
// hash_equals() plutôt que === : comparaison en temps constant, pour ne pas
// laisser une attaque par mesure de timing déduire des informations sur le
// mot de passe stocké. Mot de passe en clair (USR_MDP) assumé consciemment
// pour cette application interne (voir journal section 2) — cette précaution
// est un geste peu coûteux, pas une garantie de sécurité forte sur ce point.
if (!$user || !hash_equals($user['USR_MDP'], $motdepasse)) {
// Message volontairement générique : ne pas révéler si c'est l'identifiant
// ou le mot de passe qui est en cause. Le compteur d'essais / la sortie au
// 3e échec sont gérés côté front, pas ici (voir en-tête de ce fichier).
echo json_encode(['success' => false]);
exit;
}
// Session ouverte : les endpoints suivants (contacts.php, professions.php,
// statuts.php, realisations.php) exigent désormais $_SESSION['USR_Code']
// (voir journal, section 15).
$_SESSION['USR_Code'] = $user['USR_Code'];
echo json_encode([
'success' => true,
'user' => [
'USR_Code' => $user['USR_Code'],
'USR_Nom' => $user['USR_Nom'],
],
]);