2017-09-19 2 views
1

J'ai repéré le problème de réinitialisation du mot de passe à la méthode de hachage dans le DatabaseTokenRepository. Quand il compare les deux hachages de jeton (celui obtenu à partir de la demande de réinitialisation de l'utilisateur et celui de la base de données), il échoue, quoi qu'il arrive. J'ai essayé de copier simplement coller de la base de données et comparer les deux chaînes de cette façon, mais il renvoie encore faux.Laravel - Hasher/Réinitialiser le problème de mot de passe

J'utilise Laravel 5,4

jeton de l'utilisateur (De l'e-mail de réinitialisation)

"$2y$10$xAnDTr6/G41sAROp4h76hOhx7c4Ily4eYBtFc1J4voCgwIRhq9Mge" 

Base de données Token

"$2y$10$xAnDTr6/G41sAROp4h76hOhx7c4Ily4eYBtFc1J4voCgwIRhq9Mge" 

Retour de la fonction Hasher est encore false.

code de la DatabaseTokenRepository

public function exists(CanResetPasswordContract $user, $token) 
{ 
    $record = (array) $this->getTable()->where(
     'email', $user->getEmailForPasswordReset() 
    )->first(); 

    //dump($token); 
    //dump($record['token']); 
    //dd($this->hasher->check($token, $record['token'])); 

    return $record && 
      ! $this->tokenExpired($record['created_at']) && 
      $this->hasher->check($token, $record['token']); 
} 

Edit: En utilisant hash_equals($token, $record['token']); renvoie true, mais qui ne sont pas une solution (puisque ce sont les fichiers source, et une mise à jour de ces fichiers briserait mon fonction)

+0

Lorsque vous dites que le jeton de l'utilisateur est ce que vous fournissez. Est-ce vrai? c'est déjà haché. – apokryfos

+0

Il est censé être haché, c'est ainsi que Laravel gère les réinitialisations de mot de passe. Vous utilisez la chaîne hachée dans une route GET, comme '/ password/reset/{token}' et il vérifie ensuite qu'il s'agit du même hachage dans la base de données et vous permet de changer le mot de passe - cependant, il utilise password_verify pour comparer échoue (car il attend une valeur non hachée). C'est ce que je veux contourner sans changer les fichiers source. @apokryfos – Classified

+0

Non ce n'est pas. '$ hasher-> check' utilise en interne [' password_verify'] (http://php.net/manual/fr/function.password-verify.php) qui accepte la valeur non hachée comme premier paramètre et la compare au hash . Il est également peu logique de hacher quoi que ce soit si vous transmettez le hash à l'utilisateur. – apokryfos

Répondre

0

J'ai foiré, au lieu d'utiliser le hachage hash_hmac prévu, j'ai utilisé celui de la base de données qui est hashed deux fois - qui a abouti à échouer à chaque fois parce que le password_verif La fonction y nécessite la valeur et non le hachage.

Pour toute personne ayant le même problème, je vous conseille de vérifier ce que vous envoyez à l'utilisateur, c'est là que j'ai raté en saisissant le jeton de la base de données au lieu de le transmettre aux contrôleurs.