我想在忘记密码期间通过生成的令牌从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 ...
我的目的是通过哈希令牌向用户发送电子邮件,并向该用户发送电子邮件。
答案 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?中提到的要点,我不会建议采用这种方法。