Created
February 21, 2019 09:31
-
-
Save quenti77/f350877b18c61208c7a00db4f454da92 to your computer and use it in GitHub Desktop.
Espace membre (inscription, connexion) avec token remember
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
/** | |
* On va faire une connexion basique mais avec le "Se souvenir de moi" | |
* | |
* Je ne montre pas le formulaire de connexion car | |
* il n'y a rien d'interessant à voir | |
* | |
* Comme pour l'inscription je travail avec php 7.2 vu | |
* que php 7.1 et avant n'est plus maintenu | |
* | |
* Voir : http://php.net/supported-versions.php | |
*/ | |
require __DIR__ . '/db.php'; | |
if (!empty($_POST)) { | |
$errors = []; | |
$auth = $_POST['auth'] ?? null; | |
$password = $_POST['password'] ?? null; | |
$remember = isset($_POST['remember']); // Si existe c'est check sinon c'est pas check | |
if (empty($auth) || empty($password)) { | |
$errors[] = 'Merci de remplir tous les champs obligatoire'; | |
} | |
$reqSelectUser = $db->prepare('SELECT id, username, email, pass | |
FROM members WHERE username = :auth_name OR email = :auth_mail'); | |
$reqSelectUser->execute([ | |
':auth_name' => $auth, | |
':auth_mail' => $auth | |
]); | |
$user = $reqSelectUser->fetch(); | |
if ($user === false || password_verify($password, $user['pass'])) { | |
// On a pas trouver d'utilisateuravec le mail ou le pseudo | |
// OU le mot de passe n'est pas bon | |
$errors[] = 'Votre pseudo, email ou votre mot de passe n\'est pas bon'; | |
} | |
if (empty($errors)) { | |
if ($remember) { | |
$uniqId = uniqid(); | |
$time = time(); | |
$tokenData = "{$user['username']}#{$uniqId}#{$time}"; | |
$token = hash('sha512', $tokenData); | |
// Les 3 tirets permettrons de séparer l'id du token facilement | |
$cookieData = "{$user['id']}---{$token}"; | |
$cookieExpire = time() + 3600 * 24 * 7; // 7 jours | |
setcookie('remember', $cookieData, $cookieExpire, '/', null, false, true); | |
} | |
// On supprime du tableau le mot de passe | |
// Pour ne pas le stocker en session | |
unset($user['pass']); | |
$_SESSION['auth'] = $user; | |
echo "Connection OK"; | |
} else { | |
echo "Connection NOK"; | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
session_start(); | |
/** | |
* Pour plus de lisibilité c'est mieux | |
* de sortir les variables de configurations | |
*/ | |
$type = 'mysql'; | |
$host = 'localhost'; | |
$name = 'test'; | |
$user = 'root'; | |
$pass = 'root'; | |
try { | |
$db = new PDO("{$type}:host={$host};dbname={$name};charset=utf8", $user, $pass); | |
// Ajout des options à pdo pour activer les erreurs par exemple | |
$db->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC); | |
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); | |
$db->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); | |
} catch (PDOException $exception) { | |
echo 'Probleme de connexion à la base de données'; | |
var_dump($exception->getMessage()); | |
exit(); | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
create table members | |
( | |
id BIGINT UNSIGNED auto_increment, | |
username VARCHAR(50) not null, | |
email VARCHAR(255) not null, | |
pass VARCHAR(255) not null, | |
remember_token varchar(255) null, | |
constraint members_pk | |
primary key (id) | |
); | |
create unique index members_email_uindex | |
on members (email); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
// Sur toute les autres pages (à mettre dans un fichier tout le temps inclus comme db.php) | |
// Après le démarrage de la session | |
function remember() { | |
if (!empty($_SESSION['auth']) || empty($_COOKIE['remember'])) { | |
return false; | |
} | |
$data = explode('---', $_COOKIE['remember']); | |
if (count($data) !== 2) { | |
return false; | |
} | |
[$userId, $token] = $data; | |
$reqSelectUser = $db->prepare('SELECT id, username, email | |
FROM members WHERE id = :id AND remember_token = :token'); | |
$reqSelectUser->execute([ | |
':id' => $userId, | |
':token' => $token | |
]); | |
$user = $reqSelectUser->fetch(); | |
if ($user) { | |
// Reconnection en remettant les informations de l'utilisateur | |
$_SESSION['auth'] = $user; | |
return true; | |
} | |
return false; | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
/** | |
* On va faire une inscription basique : | |
* Juste un pseudo, mail et password | |
* | |
* Je ne montre pas le formulaire d'inscription car | |
* il n'y a rien d'interessant à voir | |
* | |
* Je travail avec php 7.2 vu que php 7.1 et avant n'est plus maintenu | |
* Voir : http://php.net/supported-versions.php | |
*/ | |
require __DIR__ . '/db.php'; | |
if (!empty($_POST)) { | |
// Initialisation du tableau d'erreur | |
$errors = []; | |
// Voir : http://php.net/manual/fr/migration70.new-features.php#migration70.new-features.null-coalesce-op | |
$username = $_POST['username'] ?? null; | |
$password = $_POST['password'] ?? null; | |
$confirmPassword = $_POST['confirm_password'] ?? null; | |
$email = $_POST['email'] ?? null; | |
if (empty($username) || empty($password) || empty($confirmPassword) || empty($email)) { | |
$errors[] = 'Merci de remplir tous les champs obligatoire'; | |
} | |
$usernameSize = mb_strlen($username); | |
if ($usernameSize < 3 || $usernameSize > 50) { | |
$errors[] = 'Votre pseudo doit être compris entre 3 et 50 caractères'; | |
} | |
$passwordSize = mb_strlen($password); | |
if ($passwordSize < 8) { | |
$errors[] = 'Pour plus de sécurité nous demandons un mot de passe de 8 caractères minimum'; | |
} | |
if ($password !== $confirmPassword) { | |
$errors[] = 'Vos mot de passe ne correspondent pas'; | |
} | |
if (!filter_var($email, FILTER_VALIDATE_EMAIL)) { | |
$errors[] = 'Votre addresse email est dans un format non valide'; | |
} | |
// Vérification que la personne n'est pas déjà inscrite avec son adresse mail | |
if (empty($errors)) { | |
$reqSelectUser = $db->prepare('SELECT id FROM members WHERE email = :email'); | |
$reqSelectUser->execute([ | |
':email' => $email | |
]); | |
$user = $reqSelectUser->fetch(); | |
if ($user) { | |
// fetch retourne false si pas/plus de ligne à lire et sinon un tableau | |
// Donc si $user est !== false alors c'est qu'il existe et c'est pas bon | |
$errors[] = 'Un utilisateur existe déjà avec cette adresse mail'; | |
} | |
} | |
// Si on a pas d'erreur | |
if (empty($errors)) { | |
$passwordHash = password_hash($password, PASSWORD_DEFAULT, [ | |
'cost' => 14 | |
]); | |
$reqInsert = $db->prepare('INSERT INTO members (username, email, pass, remember_token) | |
VALUES (:username, :email, :pass, NULL)'); | |
$reqInsert->execute([ | |
':username' => $username, | |
':email' => $email, | |
':pass' => $passwordHash | |
]); | |
// Redirection vers une autre page (connexion par exemple) | |
echo "Register OK"; | |
} else { | |
// Redirection sur la page d'inscription | |
// avec en session par exemple la liste des erreurs | |
echo "Register NOK"; | |
var_dump($errors); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment