我已将重置密码问题追溯到 DatabaseTokenRepository 中的 hasher 方法。
当它比较两个 token 哈希值(一个从用户的重置请求中获得的哈希值和一个从数据库中获得的哈希值)时,无论如何都会失败。我已经尝试从数据库中直接复制粘贴并以这种方式比较两个字符串,但它仍然返回 false。
我正在使用 Laravel 5.4
用户 token (来自重置邮件)
"$2y$10$xAnDTr6/G41sAROp4h76hOhx7c4Ily4eYBtFc1J4voCgwIRhq9Mge"
数据库 token
"$2y$10$xAnDTr6/G41sAROp4h76hOhx7c4Ily4eYBtFc1J4voCgwIRhq9Mge"
哈希函数的返回值仍然是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,但这不是解决方案(因为这是源文件,对这些文件的更新会破坏我的功能)
最佳答案
我搞砸了,我没有使用预期的 hash_hmac 哈希,而是使用了数据库中的哈希两次 - 这导致它每次都失败,因为 password_verify 函数需要值而不是哈希。
对于遇到相同问题的任何人,我建议您查看您通过电子邮件发送给用户的内容,这是我从数据库中获取 token 而不是通过 Controller 传递 token 的地方。
关于php - Laravel - 哈希器/重置密码问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46294896/