【问题标题】:Laravel 5 How to check password reset token if it has expired or notLaravel 5如何检查密码重置令牌是否已过期
【发布时间】:2016-01-03 07:20:04
【问题描述】:

我正在使用 Laravel 5 开发一个 Web 应用程序,我使用了 Laravel 的 make:auth 脚手架。我能够发送带有令牌的密码重置链接,这对我来说效果很好。单击重置链接后,我有这种 url:http://example.com/password/reset/{reset_token}。 现在,在我的 auth.reset 刀片文件中,我想先检查 {reset_token} 是否已经过期,因为它似乎在 config.auth.php 的 60 分钟过期时间内,它似乎没有自动删除过期的令牌。因此,我正在尝试使用手动功能检查重置令牌是否仍然有效:

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;
}

我该怎么做?是否有一些内置方法可以检查令牌是否已过期?谢谢。

【问题讨论】:

    标签: php laravel laravel-5


    【解决方案1】:

    使用created_at 检查插入时是否已经过了某个持续时间。例如,您可以这样做:

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

    然后检查令牌是否存在。

    【讨论】:

    • 非常感谢@Mithredate。这真的很有道理。
    • 这在 5.4 中不再起作用,因为令牌现在在数据库中进行了哈希处理。
    • 在 Laravel 5.4 中,令牌现在是散列的。有一个未记录的接口 TokenRepositoryInterface ,它有一个名为 exists() 的方法。类 tha timpolements 该接口具有用于令牌验证的方法。
    • @user777 正确。顺便说一句,你知道哪个具体类有 exists() 实现吗?
    • @crabbly 我是这样做的: $reminder = Reminder::where('email', $user->email)->first(); if (!$reminder or !Hash::check($resetToken, $reminder->token)) { return $this->respondNotFound();其中 Reminder 是 user_reminders (在 laravel 中默认为:password_resets
    【解决方案2】:

    另一种方法 - 是调用工匠命令auth:clear-resets

    【讨论】:

    • 这根本不能回答问题。 OP 询问如何检查给定令牌是否已过期。您提到的命令会从数据库中删除过期的令牌。
    【解决方案3】:

    开启 >= 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 Eloquent 模型(在 laravel 中默认为:password_resets

    【讨论】:

      【解决方案4】:

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

      【讨论】:

      • 在哪里可以找到tokenExpired 函数?上什么课?
      • 该函数在vendor文件夹中,你可以在namespace Illuminate\Auth\Passwords;中的DatabaseTokenRepository类中找到它
      • 酷,你的答案似乎比我三年前接受的答案更相关。谢谢!
      猜你喜欢
      • 2020-11-19
      • 2018-03-12
      • 2019-05-02
      • 1970-01-01
      • 2023-04-10
      • 2021-12-21
      • 1970-01-01
      • 2020-07-12
      • 2023-03-27
      相关资源
      最近更新 更多