我已将重置密码问题追溯到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,但这不是解决方案(因为这是源文件,对这些文件的更新会破坏我的功能)
答案 0 :(得分:0)
我搞砸了,而不是使用预期的hash_hmac哈希,而是使用数据库中的哈希两次哈希 - 这导致它每次都失败,因为password_verify函数需要值而不是哈希值。
对于任何有同样问题的人,我建议你研究一下你通过电子邮件发送给用户的内容,这是我从数据库中抓取令牌而不是通过控制器传递它来搞砸的地方。