Laravel 5通过散列令牌从resetpasswordlog检索用户电子邮件

时间:2018-06-01 11:14:52

标签: laravel laravel-5

我想在忘记密码期间通过生成的令牌从Laravel 5.5中的resetpasswordlog(注意,我已经更改了表名)表中获取记录。我不想使用默认通知,而是向用户发送电子邮件。我使用了Hash :: make($ token),但这与" resetpasswordlog"中的任何记录都不匹配。表

// user model
public function sendPasswordResetNotification($token)
{
dd(Hash::make($token));
}

结果是:

  

$ 2Y $ 10 $ sBeJOd33E7A10ZSwvVZpFeqNe / Cka2jYLdp4rI8fwIkgIFoJZgY5S

但是在db表中,我看到记录输入如下:

  

$ 2Y $ 10 $ v1BM7EE4Xs64Xlv8Cktz / OHpwS / KX0qpMjg4Jf.VuPg ...

我的目的是通过哈希令牌向用户发送电子邮件,并向该用户发送电子邮件。

1 个答案:

答案 0 :(得分:1)

Bcrypt为同一输入字符串生成不同的哈希值,因为它在散列期间生成随机的128位盐,因此Hash::make的值将不匹配。

相反,您可以使用check方法确认未散列的标记是否与数据库中的散列标记值匹配,即

Hash::check($token, $hashedTokenInDatabase);

此外,由于上述情况,您无法直接通过令牌直接检索用户的电子邮件,因此您需要一个字段,您可以通过该字段查询 resetpasswordlog表,用于检索相对哈希标记值。

解决方法是扩展DatabaseTokenRepository类并覆盖其getPayload方法,以便令牌不会在数据库中进行哈希处理,并且可以使用数据库从数据库中检索电子邮件。匹配令牌,即

return ['email' => $email, 'token' => $token, 'created_at' => new Carbon];

但是,如果担心安全问题,那么由于Should password reset tokens be hashed when stored in a database?中提到的要点,我不会建议采用这种方法。