天天看點

laravel 自定義郵箱驗證過期時間

使用像 Laravel 這樣的架構的最大好處之一是許多常見的用例或問題已經得到解決;郵箱驗證也不例外。

從 Laravel 5.7 開始,可以使用 Laravel 開箱即用地實作電子郵件驗證 外貿建站,外貿獨立站,外貿推廣,谷歌推廣,谷歌SEO,谷歌優化。

我假設您已經擁有此設定并在您自己的環境中工作。

預設情況下,Laravel 發出的驗證郵件将在60 分鐘後過期。在某些情況下這可能沒問題,但在我的情況下這沒有任何實際用途。使用者抱怨他們點選了連結,隻是因為它不起作用,而且由于舊連結過期,他們不得不請求新的驗證電子郵件。

要解決這個問題,有兩種解決方案,更新配置的過期時間,或者重寫生成驗證 URL 的方法。

更新配置的過期時間

這是 Laravel 5.8 中引入的功能,是以如果你還在使用 Laravel 5.7,請跳到下一節。

如果我們檢查,Illuminate\Auth\Notifications\VerifyEmail我們可以看到該verificationUrl方法如下所示:

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

正如您在上面看到的,在生成臨時簽名路由時,架構會嘗試在 處擷取一個配置變量,auth.verification.expire如果找不到,則會回退到 60 分鐘。

如果您仍想在驗證 URL 中包含過期時間,則隻需将過期時間的配置設定添加到您的config/auth.php檔案中,如下所示:

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

覆寫驗證 URL 的生成

就我而言,我不想隻更新過期時間,我想完全删除它;贊成簡單的簽名路線。

為此,我們隻需要擴充VerifyEmail類并覆寫verificationUrl方法。

我在我的項目中有一個名為的目錄,Core我将所有助手、自定義類和一般應用程式邏輯放在其中,這些邏輯在邏輯上不适合其他任何地方。您可能有一個類似的目錄或不同的地方,您希望放置此代碼;是以,請酌情替換。

添加新檔案App/Core/Auth/VerifyEmail.php

用以下内容填充此檔案:

<?php
 
namespace App\Core\Auth;
 
use Illuminate\Support\Carbon;
use Illuminate\Support\Facades\URL;
 
class VerifyEmail extends \Illuminate\Auth\Notifications\VerifyEmail
{
    protected function verificationUrl($notifiable)
    {
        return URL::signedRoute(
            'verification.verify',
            [
                'id' => $notifiable->getKey(),
                'hash' => sha1($notifiable->getEmailForVerification()),
            ]
        );
    }
}           

更新您的User模型以覆寫sendEmailVerificationNotification使用上面新建立的類的方法:

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

瞧!現在将使用您自定義的驗證 URL 生成您的電子郵件驗證電子郵件

在我上面的例子中,我仍然想要一個簽名的路由,以便我可以驗證驗證 URL 沒有被篡改,但是你可以用你想要的任何方式替換它來生成 URL。例如,讓我們從我的第一種方法中實作一年逾時;隻需更新verificationUrl為:

protected function verificationUrl($notifiable)
    {
        return URL::temporarySignedRoute(
            'verification.verify',
            Carbon::now()->addMinute(525600),
            [
                'id' => $notifiable->getKey(),
                'hash' => sha1($notifiable->getEmailForVerification()),
            ]
        );
    }