Skip to content

Instantly share code, notes, and snippets.

@quenti77
Created February 21, 2019 09:31
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save quenti77/f350877b18c61208c7a00db4f454da92 to your computer and use it in GitHub Desktop.
Save quenti77/f350877b18c61208c7a00db4f454da92 to your computer and use it in GitHub Desktop.
Espace membre (inscription, connexion) avec token remember
<?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";
}
}
<?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();
}
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);
<?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;
}
<?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