2015-10-06 206 views
3

我正在使用Laravel 5开发Web应用程序,我正在使用内置密码&身份验证控制器。我可以用一个令牌发送密码重置链接,这在我身边很好。点击重置链接后,我有这种网址:http://example.com/password/reset/{reset_token}。 现在,在我的auth.reset上,我想首先检查{reset_token}是否已经过期,因为它似乎在60分钟到期时间config.auth.php似乎不会自动删除过期的令牌。所以,我做了一个手动函数来检查重置令牌是否有效:Laravel 5如何检查密码重置令牌是否已过期

function validate_reminder_token($token){ 
    // I want to add some filter here like 
    // if(token_is_expired($token)) return false;  
    $res = DB::table('password_resets')->where('token', '=', $token)->get(); 
    if(empty($res) || $res === null) 
     return false; 
    $res = $res[0]; 
    return $res->email; 
} 

我该怎么办?是否有内置的方式来检查令牌是否过期?谢谢。

回答

4

使用created_at来检查插入时是否已经过去了一段时间。例如,您可以这样做:

$token = DB::table('password_resets') 
    ->where('token','=',$token) 
    ->where('created_at','>',Carbon::now()->subHours(2)) 
    ->first(); 

然后检查令牌是否存在。

+0

非常感谢你@Mithredate。这真的很有道理。 – dexterb

+0

不客气;) – Mithredate

+1

这在5.4中不再适用,因为令牌现在在数据库中被散列了。 – mtpultz

0

替代方式 - 是调用人员命令auth:clear-resets

1

开> = Laravel 5.4

$reminder = Reminder::where('email', $user->email)->first(); 

if (! $reminder or ! Hash::check($resetToken, $reminder->token)) { 
    // Return 404, as Reminder was not found 
    return $this->respondNotFound(); 
} 

哪里Reminderpassword_resets锋模型(通过默认在laravel:password_resets

3

要验证是否重置令牌已过期,只需检查Laravel功能tokenExpired ($created_at, $token)

此功能仅执行以下:

return Carbon::parse($createdAt)->addSeconds($this->expires)->isPast();

例如

$created_at = DB::table('password_resets')->first()['created_at']; 
// => 2018-01-08 09:59:26 

// Carbon::now(); 
// => 2018-01-08 11:03:05 

Carbon::parse($created_at)->addSeconds(config('auth.passwords.users.expire'*60))->isPast() 
// => true (with an expiration setting of 1 hour) 
+0

我在哪里可以找到'tokenExpired'函数?在什么课上? – dexterb

+1

该函数位于供应商文件夹中,您可以在'namespace Illuminate \ Auth \ Passwords'类的'DatabaseTokenRepository'类中找到它;' –

+0

很酷,您的回答似乎与3年前我接受的答案相关得多。感谢那! – dexterb