Laravel 5.6 - 重置密码令牌如何确保它们匹配?

Laravel 5.6 - Reset Password Tokens how to ensure they match?

当用户忘记密码并尝试重置密码时,他们会收到一封重置密码电子邮件 link,其中包含一个令牌:

site.com/my/password/reset/ddc3669ab1bbd78abe620ef910716ae91678bb4beb5cd8896e21efaaa0c9d5c6

虽然在后端,数据库中的令牌 password_resets table 看起来像是经过哈希处理的: y$O6pgU21FhsOcgpgeqR8RReFYoCGhHNBH5bHKxtE6q1tJMTUufrbr.

所以访问路由时,传递的唯一标识信息是令牌: ddc3669ab1bbd78abe620ef910716ae91678bb4beb5cd8896e21efaaa0c9d5c6

// Controller Method
passwordResetVerifyByToken($token){
  $record = DB::table('password_resets')->where('token', $token)
                                        ->first();
}

当然我们不会得到记录,因为电子邮件中的普通标记与数据库中的散列标记与上述查询不匹配。因此,对于普通的电子邮件令牌 link,当用户单击它时,我们如何将其与数据库中的令牌进行比较以验证它是否存在并且是匹配的令牌?

您应该使用 Hash::check 方法,该方法 return 真或假取决于重置令牌的哈希值是否与存储的数据库值匹配。

if (Hash::check($token, $row->token)) {
    // The passwords match...
}

Laravel 文档: https://laravel.com/docs/5.6/hashing#basic-usage

别担心Laravel有自己的高级函数哈希你应该试试这个

if (Hash::check($token, $row->token)) {
  // write your code or other function 
 }