3 votes

Connexion automatique à partir d'un lien e-mail et PHP ?

J'essaie de créer un lien qui, lorsqu'il est cliqué, connecte automatiquement l'utilisateur et l'amène à une page spécifique.

J'ai pensé à créer une sorte de chaîne hachée contenant l'identifiant de l'utilisateur, son nom d'utilisateur et quelques autres informations. Lorsque l'on clique sur ces informations, elles sont recherchées dans la base de données et, si elles sont validées, je les connecte et les redirige vers une page spécifique.

Pour des sites comme Twitter et Facebook, lorsque je reçois une notification par courrier électronique et que je clique sur le lien dans mon courrier électronique, je suis automatiquement dirigé vers ma boîte de réception sur le site correspondant. J'essaie de reproduire ce comportement...

Y a-t-il des problèmes de sécurité ou existe-t-il un moyen plus sûr ?

9voto

lilobase Points 451

Si vous souhaitez offrir cette fonctionnalité à vos utilisateurs, vous devez veiller à deux choses :

  • La validité de l'url créée doit être fixée dans le temps (ex : 24h, 48h).
  • L'url créée ne doit fonctionner que pour un utilisateur spécifique.
  • (optionnel) L'url créée ne fonctionne que pour une seule page

Je propose ce type de solution pour créer une url correspondant à ces critères (ce n'est qu'une preuve de concept) :

<?php

$privateKey = 'somethingVerySecret';
$userName = 'cedric';
$url = 'my/personal/url';
$timeLimit = new DateTime('Tomorow');

function createToken($privateKey, $url, $userName, $timeLimit){
    return hash('sha256', $privateKey.$url.$userName.$timeLimit);
}

function createUrl($privateKey, $url, $userName, $timeLimit){ 
    $hash = createToken($privateKey, $url, $userName, $timeLimit->getTimestamp());

    $autoLoginUrl = http_build_query(array(
        'name' => $userName,
        'timeLimit' => $timeLimit,
        'token' => $hash
    ));
    return $url.'?'.$autoLoginUrl;
}

function checkUrl($privateKey){  
    if((int)$_GET['timeLimit'] > time() ){
        return false;
    }

    //check the user credentials (he exists, he have right on this page)

    $hash = createToken($privateKey, $_SERVER['PHP_SELF'], $_GET['name'], $_GET['timeLimit']);

    return ($_GET['token'] == $hash);
}

-1voto

Noah Huppert Points 1501

La norme générale pour la connexion est la suivante : lorsqu'un utilisateur crée un compte, votre programme doit créer une chaîne de lettres et de chiffres apparemment aléatoires à l'aide d'une certaine fonction de php 5.5, puis la stocker dans un fichier avec une sorte de pointeur basé sur le nom d'utilisateur. Ensuite, lorsqu'un utilisateur essaie de se connecter, vous utilisez cette même fonction et comparez les deux chaînes. La fonction étant hash_pbkdf2 même si cette fonction php prend en charge les sha... les cryptages ne les utilisent pas. Je sale le code de hachage avec le nom d'utilisateur. Ici est un article sur toutes les questions relatives aux identifiants et aux mots de passe des sites web. La chose la plus sûre que vous puissiez faire avec votre site web pour empêcher les gens de craquer vos mots de passe par force brute est de limiter la vitesse de connexion après quelques tentatives de mots de passe erronés à quelque chose de tellement lent que cela prendrait plus de temps que la vie de l'univers pour craquer après quelques tentatives de mots de passe. Si vous voulez créer une sorte de bouton "Souvenez-vous de moi", stockez le nom d'utilisateur dans les cookies. Mais jamais le mot de passe le navigateur se chargera de la mémorisation du mot de passe si vous libellez correctement les éléments de votre formulaire.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X