2015-10-06 205 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