Laravel - Hasher /重置密码问题

时间:2017-09-19 07:51:47

标签: php mysql laravel hash

我已将重置密码问题追溯到DatabaseTokenRepository中的hasher方法。

当它比较两个令牌哈希值(它来自用户的重置请求和数据库中的那个)时,无论如何都会失败。我试过从数据库中明确地复制粘贴并比较这两个字符串,但它仍然返回false。

我正在使用Laravel 5.4

用户令牌(来自重置电子邮件)

"$2y$10$xAnDTr6/G41sAROp4h76hOhx7c4Ily4eYBtFc1J4voCgwIRhq9Mge"

数据库令牌

"$2y$10$xAnDTr6/G41sAROp4h76hOhx7c4Ily4eYBtFc1J4voCgwIRhq9Mge"

hasher功能的返回仍然是 false

来自 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']);
}

修改 使用hash_equals($token, $record['token']);返回true,但这不是解决方案(因为这是源文件,对这些文件的更新会破坏我的功能)

1 个答案:

答案 0 :(得分:0)

我搞砸了,而不是使用预期的hash_hmac哈希,而是使用数据库中的哈希两次哈希 - 这导致它每次都失败,因为password_verify函数需要值而不是哈希值。

对于任何有同样问题的人,我建议你研究一下你通过电子邮件发送给用户的内容,这是我从数据库中抓取令牌而不是通过控制器传递它来搞砸的地方。