mirror of
https://github.com/JMP-MS/ASPIC.git
synced 2026-08-28 23:33:13 +00:00
94 lines
4.2 KiB
PHP
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'],
|
|
],
|
|
]);
|