如何使用Laravel 5.5中的密码代理外观将用户与令牌匹配?
我通过生成令牌向用户发送邮件:
app('auth.password.broker')->createToken($this->user)
这会自动使用用户电子邮件填充数据库中的password_resets
表,并使用看似已散列的令牌值。
用户的回调URL是password-reset/{token}
,现在我想检查令牌是否有效,检查它是否存在于DB中,如果用户连接到它,甚至触发了密码重置。
$tokenValid = DB::table('password_resets')->where('token', $input['token'])->first();
然而,这不起作用,因为来自输入的令牌不以任何方式进行散列。我也尝试了这个
$tokenValid = DB::table('password_resets')->where('token', bcrypt($input['token']))->first();
但散列值不正确。
有人知道如何将其与DB值相匹配吗?
我找到了答案。两个哈希,即使不同,也可能匹配。在同一个字符串上执行两次bcrypt()
函数不会产生相同的散列,因此有一个帮助方法来检查散列是否匹配:
Hash::check($input['token'], $token->token)
你可以将未散列的令牌插入(password_resets)数据库表中,如下所示: -
public function forgotpassword_post(){
$admin=Admin::where('email',request('email'))->first();
if(!empty($admin)){
$token=app('auth.password.broker')->createToken($admin);
Mail::to($admin->email)->send(new AdminResetPassword(['data'=>$admin,'token'=>$token]));
DB::table('password_resets')->insert([
'email'=>$admin->email,
'token'=>$token,
'created_at'=>Carbon::now()
]);
Session::flash('success','sent');
return back();
}
return back();
}
你可以像这样检查令牌验证: -
public function reset_password($token){
$check_token= DB::table('password_resets')->where('token',$token)->where('created_at','>',Carbon::now()->subHours(2))->first();
if(!empty($check_token)){
return view('admin.reset_password',['data'=>$check_token]);
}else{
return redirect('/admin/forgorpassword');
}
}