Laravel 5.7邮箱验证过期时间

Laravel 5.7 email verification expiration time

我想自定义用户必须通过内置 Auth(自 5.7 起)验证其电子邮件地址的时间。

config/auth中有:

'passwords' => [
        'users' => [
            'provider' => 'users',
            'table' => 'password_resets',
            'expire' => 60,
        ],
    ],

但我还没有发现任何类似的电子邮件验证。 the official documentation.

中也没有提及

如果打开 Illuminate\Auth\Notifications\VerifyEmail::class;

生成 URL 的方法已经使用默认为 1 小时的过期时间。不幸的是,没有修改该值的选项。

/**
 * Get the verification URL for the given notifiable.
 *
 * @param  mixed  $notifiable
 * @return string
 */
protected function verificationUrl($notifiable)
{
    return URL::temporarySignedRoute(
        'verification.verify', Carbon::now()->addMinutes(60), ['id' => $notifiable->getKey()]
    );
}

事实上 Laravel 中没有这些选项,但由于 laravel 使用了以下选项:

  • 一个特征MustVerifyEmail(在Illuminate\Foundation\Auth\Userclass中由主要User模型扩展)

  • 事件和通知

MustVerifyEmail trait 中,有一个名为 sendEmailVerificationNotification 的方法。这是 引用的通知 VerifyEmail class 及其函数 verificationUrl 使用的地方:

/**
 * Send the email verification notification.
 *
 * @return void
 */
public function sendEmailVerificationNotification()
{
    $this->notify(new Notifications\VerifyEmail);
}

既然我们知道了这一点,我们就可以做到以下几点:

  • Notifications\VerifyEmail 扩展为我们的自定义 VerifyEmail class
  • 覆盖 verificationUrl
  • 的实施
  • 覆盖 User 模型中 sendEmailVerificationNotification 方法的实现以使用我们新的 VerifyEmail class.

完成上述操作后,我们的 User 模型将具有以下方法:

/**
 * Send the email verification notification.
 *
 * @return void
 */
public function sendEmailVerificationNotification()
{
    $this->notify(new \App\Services\Verification\VerifyEmail);
}

现在我们使用我们的习惯 VerifyEmail class。那么我们的新 VerifyEmail class 将如下所示:

namespace App\Services\Verification;

use Illuminate\Support\Carbon;
use \Illuminate\Support\Facades\URL;

class VerifyEmail extends \Illuminate\Auth\Notifications\VerifyEmail
{
    protected function verificationUrl($notifiable)
    {
        return URL::temporarySignedRoute(
            'verification.verify', Carbon::now()->addMinute(3), ['id' => $notifiable->getKey()]
        );  //we use 3 minutes expiry
    }
}

好吧,除了解释之外,这个过程非常简单。我希望它很容易掌握。干杯!

虽然这个问题专门针对 Laravel 5.7,但我觉得值得一提的是,从 Laravel 5.8 开始,可以使用配置变量来实现这一点。我对自定义验证到期时间的搜索返回了这个问题作为最高结果,因此我添加了。

如果我们查看 Illuminate\Auth\Notifications\VerifyEmailverificationUrl 方法现在看起来像这样:

protected function verificationUrl($notifiable)
{
    return URL::temporarySignedRoute(
        'verification.verify',
        Carbon::now()->addMinutes(Config::get('auth.verification.expire', 60)),
        ['id' => $notifiable->getKey()]
    );
}

因此,我们只需将此块添加到 config/auth.php 即可自定义时间,而无需扩展 类 或任何内容:

'verification' => [
    'expire' => 525600, // One year - enter as many mintues as you would like here
],

UPDATE:我已经写过关于上述方法的文章,还有一篇关于通过覆盖 verificationUrl 方法来自定义流程的文章,为您提供更大的灵活性,on my blog.