Laravel 5如果密码重置令牌已过期,如何检查密码重置令牌

Dex*_*gil 4 php laravel laravel-5

我正在使用Laravel 5开发一个Web应用程序,我使用了Laravel的make:auth脚手架.我能够使用令牌发送密码重置链接,这在我的结束时运行良好.点击重置链接后,我有这种网址:http://example.com/password/reset/{reset_token}.现在,在我的auth.reset刀片文件中,我想首先检查是否{reset_token}已经过期,因为它似乎在60分钟的到期时间内config.auth.php,它似乎不会自动删除过期的令牌.所以,我正在尝试制作一个手动功能来检查重置令牌是否仍然有效:

function validateReminderToken($token)
{
    // I want to add some filter here like
    // if (tokenExpired($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;
}
Run Code Online (Sandbox Code Playgroud)

我该怎么做?是否有一些内置的方法来检查令牌是否已过期?谢谢.

Mit*_*ate 8

使用created_at以检查从插入时间开始是否已经过了一定的持续时间.例如,您可以这样做:

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

然后检查令牌是否存在.

  • 这在5.4中不再起作用,因为令牌现在在DB中进行了哈希处理. (3认同)

use*_*991 5

在 >= 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();
} 
Run Code Online (Sandbox Code Playgroud)

ReminderEloquent Model在哪里password_resets(laravel 中默认password_resets:)


Ele*_*dez 5

要验证重置令牌是否已过期,只需检查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)
Run Code Online (Sandbox Code Playgroud)