329 lines
5.3 KiB
PHP
329 lines
5.3 KiB
PHP
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
|
|
/*
|
|
* =========================================================
|
|
* SESSION
|
|
* =========================================================
|
|
*/
|
|
|
|
session_set_cookie_params([
|
|
'lifetime' => 0,
|
|
'path' => '/',
|
|
'secure' => !empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off',
|
|
'httponly' => true,
|
|
'samesite' => 'Strict'
|
|
]);
|
|
|
|
session_start();
|
|
|
|
|
|
/*
|
|
* =========================================================
|
|
* CONFIGURATION
|
|
* =========================================================
|
|
*/
|
|
|
|
require_once __DIR__ . '/database.php';
|
|
|
|
|
|
header('Content-Type: application/json; charset=utf-8');
|
|
|
|
|
|
/*
|
|
* =========================================================
|
|
* LECTURE JSON
|
|
* =========================================================
|
|
*/
|
|
|
|
$data = json_decode(
|
|
file_get_contents('php://input'),
|
|
true
|
|
);
|
|
|
|
$action = $data['action'] ?? '';
|
|
|
|
|
|
/*
|
|
* =========================================================
|
|
* REPONSE JSON
|
|
* =========================================================
|
|
*/
|
|
|
|
function jsonResponse(
|
|
string $status,
|
|
string $message = '',
|
|
array $extra = []
|
|
): never {
|
|
|
|
echo json_encode(
|
|
array_merge(
|
|
[
|
|
'status' => $status,
|
|
'message' => $message
|
|
],
|
|
$extra
|
|
),
|
|
JSON_UNESCAPED_UNICODE
|
|
);
|
|
|
|
exit;
|
|
}
|
|
|
|
|
|
/*
|
|
* =========================================================
|
|
* VERIFICATION SESSION
|
|
* =========================================================
|
|
*/
|
|
|
|
if ($action === 'check') {
|
|
|
|
if (
|
|
isset($_SESSION['user_id']) &&
|
|
isset($_SESSION['username'])
|
|
) {
|
|
|
|
jsonResponse(
|
|
'success',
|
|
'',
|
|
[
|
|
'authenticated' => true,
|
|
'user_id' => $_SESSION['user_id'],
|
|
'nom' => $_SESSION['username']
|
|
]
|
|
);
|
|
}
|
|
|
|
|
|
jsonResponse(
|
|
'error',
|
|
'Session inactive.',
|
|
[
|
|
'authenticated' => false
|
|
]
|
|
);
|
|
}
|
|
|
|
|
|
/*
|
|
* =========================================================
|
|
* DECONNEXION
|
|
* =========================================================
|
|
*/
|
|
|
|
if ($action === 'logout') {
|
|
|
|
/*
|
|
* Détruire complètement la session
|
|
*/
|
|
|
|
$_SESSION = [];
|
|
|
|
|
|
/*
|
|
* Supprimer le cookie de session
|
|
*/
|
|
|
|
if (
|
|
ini_get('session.use_cookies')
|
|
) {
|
|
|
|
$params = session_get_cookie_params();
|
|
|
|
setcookie(
|
|
session_name(),
|
|
'',
|
|
time() - 42000,
|
|
$params['path'],
|
|
$params['domain'] ?? '',
|
|
$params['secure'],
|
|
$params['httponly']
|
|
);
|
|
}
|
|
|
|
|
|
session_destroy();
|
|
|
|
|
|
jsonResponse(
|
|
'success',
|
|
'Déconnexion effectuée.'
|
|
);
|
|
}
|
|
|
|
|
|
/*
|
|
* =========================================================
|
|
* CONNEXION
|
|
* =========================================================
|
|
*/
|
|
|
|
if ($action === 'login') {
|
|
|
|
$nom =
|
|
trim(
|
|
(string)($data['nom'] ?? '')
|
|
);
|
|
|
|
$pass =
|
|
(string)($data['pass'] ?? '');
|
|
|
|
|
|
if (
|
|
$nom === '' ||
|
|
$pass === ''
|
|
) {
|
|
|
|
jsonResponse(
|
|
'error',
|
|
'Identifiant et mot de passe obligatoires.'
|
|
);
|
|
}
|
|
|
|
|
|
/*
|
|
* Recherche utilisateur
|
|
*/
|
|
|
|
$sql = "
|
|
SELECT
|
|
id,
|
|
nom,
|
|
pass,
|
|
actif
|
|
FROM login
|
|
WHERE nom = :nom
|
|
LIMIT 1
|
|
";
|
|
|
|
|
|
$stmt = $pdo->prepare($sql);
|
|
|
|
$stmt->execute([
|
|
':nom' => $nom
|
|
]);
|
|
|
|
|
|
$user =
|
|
$stmt->fetch(PDO::FETCH_ASSOC);
|
|
|
|
|
|
/*
|
|
* Utilisateur inexistant
|
|
*/
|
|
|
|
if (!$user) {
|
|
|
|
/*
|
|
* Même traitement que mauvais mot de passe
|
|
* afin de ne pas révéler si le compte existe.
|
|
*/
|
|
|
|
jsonResponse(
|
|
'error',
|
|
'Identifiant ou mot de passe incorrect.'
|
|
);
|
|
}
|
|
|
|
|
|
/*
|
|
* Compte désactivé
|
|
*/
|
|
|
|
if ((int)$user['actif'] !== 1) {
|
|
|
|
jsonResponse(
|
|
'error',
|
|
'Ce compte est désactivé.'
|
|
);
|
|
}
|
|
|
|
|
|
/*
|
|
* Vérification du mot de passe
|
|
*/
|
|
|
|
if (
|
|
!password_verify(
|
|
$pass,
|
|
$user['pass']
|
|
)
|
|
) {
|
|
|
|
jsonResponse(
|
|
'error',
|
|
'Identifiant ou mot de passe incorrect.'
|
|
);
|
|
}
|
|
|
|
|
|
/*
|
|
* Nouveau numéro de session
|
|
* après authentification
|
|
*/
|
|
|
|
session_regenerate_id(true);
|
|
|
|
|
|
/*
|
|
* Variables de session
|
|
*/
|
|
|
|
$_SESSION['user_id'] =
|
|
(int)$user['id'];
|
|
|
|
$_SESSION['username'] =
|
|
$user['nom'];
|
|
|
|
$_SESSION['authenticated'] =
|
|
true;
|
|
|
|
|
|
/*
|
|
* Dernière connexion
|
|
*/
|
|
|
|
$sql = "
|
|
UPDATE login
|
|
SET dernier_login = NOW()
|
|
WHERE id = :id
|
|
";
|
|
|
|
|
|
$stmt = $pdo->prepare($sql);
|
|
|
|
$stmt->execute([
|
|
':id' => $user['id']
|
|
]);
|
|
|
|
|
|
/*
|
|
* Réponse
|
|
*/
|
|
|
|
jsonResponse(
|
|
'success',
|
|
'Connexion réussie.',
|
|
[
|
|
'authenticated' => true,
|
|
'user_id' => (int)$user['id'],
|
|
'nom' => $user['nom']
|
|
]
|
|
);
|
|
}
|
|
|
|
|
|
/*
|
|
* =========================================================
|
|
* ACTION INCONNUE
|
|
* =========================================================
|
|
*/
|
|
|
|
jsonResponse(
|
|
'error',
|
|
'Action inconnue.'
|
|
);
|