Formation PUB030 : Laravel, 2019 L'authentification

37.12 Où est le code de Auth::attempt() - ou comment déboguer l'authentification


Il serait intéressant de pouvoir utiliser le débogueur lorsque l'authentification avec Auth::attempt() ne fonctionne pas dans notre application Laravel. Mais puisque Auth est une façade, il est parfois ardu de retrouver le code de ses méthodes.

Prenons le cas où on tente d'authentifier l'usager comme suit :

Contrôleur Laravel (PHP)

$courriel= $request->courriel;

$motdepasse = $request->motdepasse;


$reussi = Auth::attempt(['courriel' => $courriel, 'password' => $motdepasse, 'actif' => 1]);

Si $reussi est toujours à false même si vous êtes certains que les informations d'authentification sont bonnes, suivez cetet piste pour vous aider à déboguer l'authentification :

  • Le code de la méthode Auth::attempt() est situé dans le fichier vendor/laravel/framework/src/Illuminate/Auth/SessionGuard.php.

    Vous pouvez placer un point d'arrêt au début de cette méthode pour vérifier la valeur des informations d'authentifications (paramètre $credentials) que Laravel s'apprête à utiliser (ex : ["courriel" => "unusager@undomaine.com", "password" => "ilfaitbeau", "actif" => 1]).

    Si les informations contenues dans le paramètre $credentials ne sont pas les bonnes :

    • Dans le formulaire d'authentification, vérifiez les attributs name des boîtes de saisie. Ils doivent correspondre aux propriétés que vous tentez de lire dans $request (dans l'exemple : courriel et motdepasse).
  • Cette méthode appelle $this->hasValidCredentials(), dont le code est situé dans ce même fichier.

    À ce stade, vous pouvez vérifier les informations sur l'usager (objet $user) que Laravel a retrouvé dans la base de données à partir des informations d'authentification. Notez que le mot de passe n'a pas encore été utilisé à ce stade.

    Si l'usager n'a pas été bien retrouvé dans la BD :

    • Dans le cas où vous utilisez une table qui ne s'appele pas Users, assurez-vous d'avoir bien suivi TOUTES les étapes de la fiche Changer le nom de la table et du modèle des usagers.
    • Dans Auth::attempt(), vérifiez que chacune des clés dans le tableau associatif correspond au nom du champ dans la table des usagers (dans l'exemple, il doit y avoir un champ courriel et un champ actif).
    • Dans le tableau associatif, la clé du mot de passe doit être password, peu importe le nom du champ dans la table des usagers.
  • Ceci appelle ensuite $this->provider->validateCredentials() dont le code est dans le fichier vendor/laravel/framework/src/Illuminate/Auth/EloquentUserProvider.php.

    C'est ici que Laravel va chercher le mot de passe crypté dans l'objet $user retrouvé plus tôt.

    Si le champ ne s'appelle pas password, Laravel exécutera la méthode getAuthPassword() que vous aurez codée dans le modèle de l'usager.

  • Pour valider le mot de passe, la méthode appellera $this->hasher->check(), dont le code est dans le fichier vendor/laravel/framework/src/Illuminate/Hashing/HashManager.php.
  • Cette méthode appelle à son tour $this->driver()->check() dans le fichier vendor/laravel/framework/src/Illuminate/Hashing/AbstrackHasher.php.
  • Finalement, la méthode check() appelle password_verify(), une fonction PHP qui encrypte le mot de passe en clair et le compare au mot de passe crypté.

    À ce stade, password_verify($value, $hashedValue) devrait retourner true si vous avez fourni le bon mot de passe.

    Si ce n'est pas le cas :

    • Assurez-vous que le champ du mot de passe comporte au moins 60 caractères.
    • Vérifiez si le problème ne provient pas d'une erreur lors de la création de l'usager. Pour ce faire, créez manuellement un usager dans votre table. Donnez à cet usager le mot de passe tatatata dont la version cryptée est :

      $2y$10$jqLafXdD.ZB.h2xkZ4t72.JKJ03aDyy2651tpgGlTbBFpGx3nStsi

      C'est donc cette chaîne qui doit être copiée dans le champ du mot de passe. Attention : si vous travaillez avec MySQL Workbench, n'oubliez pas de cliquer sur Apply pour que vos modifications soient enregistrées.

      Tentez ensuite de vous connecter à l'aide de cet usager. Si cela fonctionne, vous devrez réviser le code qui se charge de créer vos usagers.

▼Publicité

Veuillez noter que le contenu de cette fiche vous est partagé à titre gracieux, au meilleur de mes connaissances et sans aucune garantie.
Merci de partager !
Soumettre