拉威尔电子邮件验证
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` ,在你的终端运行以下命令。
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加入电子邮件验证。我们还解决了我们的路由应该如何安全,从而阻止未经授权的用户访问它们。因此, 你可以利用这个经验来创建更多的创新应用.