如何使用Laravel加入电子邮件验证

151 阅读5分钟

拉威尔电子邮件验证

Laravel是一个简单易懂的基于PHP的系统。它使得在一个应用程序中编码复杂的功能变得容易。电子邮件认证是一个可以使用Laravel轻松实现的特性。

通常情况下, 如果一个用户在网站上注册, 我们需要检查电子邮件.这个过程确保我们只接受那些拥有有效电子邮件地址的用户。在过去, 在Web应用程序中编码或包含电子邮件验证是相当困难的.

Laravel的到来,让开发者的生活变得更加轻松。换句话说, 在Laravel中实现电子邮件验证只需要几行代码.

前提条件

要完成这个教程, 你将需要以下条件:

  • PHP
  • Laravel 8.x
  • MySQL

目标

在一个网站上使用Laravel实现电子邮件验证。

第1步: 安装Laravel 8

你可以通过Composer或Laravel安装程序创建一个新的Laravel应用程序。

通过Composer安装

Laravel使用Composer 来控制依赖性.因此, 在安装Laravel之前, 请确保你的电脑上已经安装了Composer.

你可以从这里下载 composer.安装完成后, 使用以下命令检查其版本.

composer --version

在你的机器上的某个地方为你的新项目建立一个新的目录, 'verifyEmailApp'.然后导航到该文件夹并使用以下指令安装Laravel.

composer create-project laravel/laravel verifyEmailApp
cd verifyEmailApp
php artisan serve

php artisan serve 命令允许应用程序被托管到本地。

使用Laravel安装程序

Laravel有一个'Laravel installer'命令行工具,用于安装Laravel应用程序。要下载Laravel安装程序, 我们使用以下命令:

composer global require laravel/installer

你需要确保'Composer二进制文件夹'在你的'PATH变量内,以便运行Laravel安装程序。检查它是否在你的PATH'变量内,以便运行Laravel安装程序。 检查它是否在你的`PATH` ,在你的终端运行以下命令。

echo $PATH

正确的输出应该是, 如下图所示:
User/username/.vendor/composer/bin

修改你的'.bashrc',如果有任何错误(屏幕上没有输出),或者,如果你使用'ZSH',你的'.zshrc'要提供你的作曲家的供应商目录的路径。

这个命令在安装时为Laravel在你选择的目录下创建一个新的安装。要建立一个项目而不在当前工作目录下有一个子目录, 可以用一个.(一个点)来代替'[foldername]'.

laravel new verifyEmailApp
cd verifyEmailApp
php artisan serve

第2步: 配置数据库

config/database.php 文件包含了所有的数据库配置.因此, 你应该在这个文件中定义所有的数据库细节.记住, 所有的数据库配置都应该是私有的.

根据你在.env 文件中的数据库设置,修改以下属性。

DB_CONNECTION=mysql #you can change this to any database
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=verification #database name
DB_USERNAME=MyDatabaseUserName #insert username
DB_PASSWORD=MyDatabasePassword #insert password

你会发现,Laravel 8会自动更新这个文件,而不需要运行命令。

php artisan config:clear

注意: 在使用Laravel 7.x时, 你必须清除cache ,以反映所做的更改.

第3步: 简单的邮件传输协议的配置

在这篇文章中, 我们将设置Mailtrap.我们将使用这个服务来测试和发送邮件.Mailtrap模拟实际的SMTP服务器,将你的邮件传递给一个测试的收件人。

Laravel支持许多开箱即用的电子邮件服务。这里包括SMTP, Mailgun, Postmark, Amazon SES, and Sendmail.在'config/mail.php',我们可以设置默认的电子邮件服务和它的证书。

在编辑mail.php 文件之前,让我们先获得Mailtrap的凭据。切换到并注册一个Mailtrap的账户。在本教程中,我们将使用一个免费计划的账户。免费计划使我们每月能发送500封邮件,并提供一个收件箱。

它只适合于小型应用。如果你已经注册了,打开Demo收件箱,你的账户会有SMTP凭证。从SMTP设置标签下的下拉菜单中挑选Laravel。这显示了你想在Laravel框架中使用的配置。

配置Mailtrap的最好方法是将其配置复制到程序的.env 文件中。这样你的程序就可以把邮件送到Mailtrap的收件箱中。然而, 你可以在部署Laravel应用后用Mailgrid, SES, 或Mailgun来代替Mailtrap.

以下是所需的Mailtrap配置。

MAIL_MAILER=smtp
MAIL_HOST=smtp.mailtrap.io
MAIL_PORT=2525
MAIL_USERNAME=YOUR_USERNAME
MAIL_PASSWORD=YOUR_PASSWORD
MAIL_ENCRYPTION=tls
MAIL_FROM_ADDRESS=YOUREMAIL
MAIL_FROM_NAME="${APP_NAME}"

第4步: 安装Laravel Jetstream Scaffolding

Laravel 8与它的认证脚手架拉开了距离,转而支持Jetstream Scaffolding。Jetstream被描述为一个 "设计精美的Laravel应用入门套件,为你的下一个Laravel应用提供理想的起点"。

Jetstream提供登录,注册,"电子邮件验证",双因素认证,会话管理,通过Laravel Sanctum的API,以及团队管理的可选功能。

这个教程假设你已经有了一个Laravel项目的设置和运行。如果你没有Laravel的项目配置, 你可以在进一步进行之前进行配置.

使用Composer, Jetstream的安装过程将开始。

在你的终端, 执行以下指令.

 composer install laravel/jetstream

我们需要等待安装完成,然后使用下面的命令编译项目的资产。

npm install && npm run dev

最后,你可以用php artisan migrate ,运行数据库迁移。

你可能面临的一个关键错误是'Max key length is 1000 bytes'。这意味着你需要改变你的服务提供商的默认字符串长度。

导航到app > providers > appserviceprovider.php ,复制并粘贴以下代码到启动方法中。

Schema::defaultStringLength(191);

另外,由于增加了新的表,你需要重新迁移。在你的终端输入php artisan migrate: fresh 命令。这一修改有助于消除max string 的错误。

第5步: 模型准备

Laravel应用程序提供了一个User 模型(数据库中的数据结构)。默认情况下, 这个模型类并没有实现Illuminate\Contracts\Auth\MustVerifyEmail 合同.

因此, 我们的第一步是要激活MustVerifyEmail 接口.


<?php

namespace App\Models;

use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;

class User extends Authenticatable implements MustVerifyEmail
{
    use Notifiable;
 /**
     * The attributes that are mass assignable.
     *
     * @var array
     */
    protected $fillable = [
        'name', 'email', 'password','email_verified_at'
    ];
  
    /**
     * The attributes that should be hidden for arrays.
     *
     * @var array
     */
    protected $hidden = [
        'password', 'remember_token',
    ];
}

添加这个接口可以让你向新注册的用户发送验证邮件.Laravel还自带了一个SendEmailVerificationNotification 监听器。

它位于App\Providers\EventServiceProvider ,并附加到Illuminate\Auth\Events\Registered 。这个事件允许你发送一个验证链接给用户。

第6步: 路由

在Laravel中实现电子邮件验证需要三个路由:

  • 一个路由显示电子邮件验证通知给用户,并有一个链接来验证电子邮件。
  • 一个路由来处理用户点击事件来验证电子邮件。
  • 一个路由来重新发送用户的要求的电子邮件。

第7步:电子邮件验证通知

在向用户发送消息后,我们应该返回一个视图,要求他们检查他们的收件箱以完成验证过程。

Route::get('/email/verify', function () {
    return view('auth.verify-email');
})->middleware('auth')->name('verification.notice');

注意:返回电子邮件验证通知的路由的名称必须为verification.notice

第8步:处理电子邮件验证

现在你已经发送了一封带有验证链接的电子邮件,接下来会发生什么?

当点击时,这个链接应该把用户重定向到仪表板或任何其他指定的路径。让我们来看看我们如何处理这个用户点击事件。


use Illuminate\Foundation\Auth\EmailVerificationRequest;
use Illuminate\Http\Request;

Route::get('/email/verify/{id}/{hash}', function (EmailVerificationRequest $request) {
    $request->fulfill();

    return redirect('/home');
})->middleware(['auth', 'signed'])->name('verification.verify');

注意:这个路由必须被命名为verification.verify

第9步:重新发送电子邮件验证链接

一些用户在这个验证阶段可能会遇到挑战。例如,有些网站使用有到期日的时间密码。如果用户延迟激活他们的账户,OTP将过期。在这种情况下,应该重新生成一个新的One Time Password

这与Laravel的电子邮件验证链接的工作方式略有关系。用户可能会在验证前意外地删除电子邮件.为了解决这个问题, Laravel提供了一个功能,可以根据用户的要求重新发送验证邮件。


use Illuminate\Http\Request;

Route::post('/email/verification-notification', function (Request $request) {
    $request->user()->sendEmailVerificationNotification();

    return back()->with('message', 'Verification link sent!');
})->middleware(['auth', 'throttle:6,1'])->name('verification.send');

第10步:保护应用程序的路由

在你的应用程序中, 有一些路线是未经验证的用户不应该访问的.保护这些路由最合适的方法是添加middleware ,如下图所示。

Route::get('/profile', function () {
    // This route can only be accessed by confirmed users...
})->middleware('verified');

未经验证的用户会被自动重定向到电子邮件验证通知路线。

总结

在这个教程中,我们已经学会了如何使用Laravel加入电子邮件验证。我们还解决了我们的路由应该如何安全,从而阻止未经授权的用户访问它们。因此, 你可以利用这个经验来创建更多的创新应用.