如何在Laravel中自定义电子邮件验证和密码重设(详细教程)

590 阅读15分钟

电子邮件验证和密码重设是现代应用程序的两个不可或缺的认证功能。在大多数网络应用中, 用户通常会重置他们丢失的密码, 然而, 他们也必须在第一次访问网络应用之前验证他们的电子邮件地址.

Laravel提供了方便的内置服务来发送和验证电子邮件验证请求,并安全地重新设置密码.但在本教程中, 你将学习如何在Laravel中创建自定义电子邮件验证和重置密码.

电子邮件验证和重设密码一目了然

每当你添加登录和注册功能的用户认证时,都需要一个密码重置选项。这样做,每当用户忘记他们的密码,他们有办法重置它。作为这个过程的一部分,复位链接中通常会有一个令牌,而且这个令牌必须经过验证。你可以看到下面一个简单的例子.

http://www.example.org/reset_password?token=169d07470f8570afdfba09f5d9452db3d74

Laravel提供了许多不同的认证实现来创建,如UI auth,Breeze Auth,和Jetstream,其中包括登录,注册,电子邮件验证,和密码重置功能。

然而,如果你要建立一个没有这些认证包的应用程序,那么你必须手动实现密码重置和电子邮件验证功能。

自定义电子邮件验证和重置密码的好处

在构建API时,可能需要定制密码重置和电子邮件验证过程,因为Laravel默认的认证脚手架的默认密码重置和电子邮件验证主要是针对Web应用程序的。

在本教程中, 你将学习如何做到这一点.你不会发送嵌入链接的令牌, 而是发送6位数的针。这些既适用于网络应用程序,也适用于API - 假设你是为移动开发者建立它们来消费的话。

创建Laravel应用程序

你可以通过Composer创建一个新的Laravel应用程序,或者将Laravel安装程序作为一个全局Composer依赖项进行安装。在本教程中,我们将使用Laravel安装器。要使用它创建应用程序, 在终端运行以下命令.

laravel new custom_authentication

这将在一个名为custom_authentication的新目录下创建一个Laravel应用程序。接下来, 通过运行以下命令进入新的应用程序目录:

cd custom_authentication

现在, 通过运行下面的命令来启动这个应用程序:

php artisan serve

默认情况下, 该项目是在localhost的8000端口服务的, 所以你现在可以通过在浏览器中输入http://localhost:8000来访问该应用程序**.** 当你这样做时,你应该看到一个类似于下图的页面,确认你的项目正在运行。

The default Laravel home page

由于应用程序正在运行,按Ctrl+C停止它。

设置环境变量

为了配置应用程序的数据库,在*.env*中,更新数据库配置设置,你可以在下面的例子中看到,以匹配你的数据库的细节:

DB_CONNECTION=
DB_HOST=
DB_PORT=
DB_DATABASE=
DB_USERNAME=
DB_PASSWORD=

由于你将使用Gmail的SMTP服务器向用户发送6位数的PIN码,你接下来需要更新邮件环境变量,以匹配下面的值。用你的Gmail用户名和密码分别替换这两个占位符:

MAIL_MAILER=smtp
MAIL_HOST=smtp.gmail.com
MAIL_PORT=465
MAIL_USERNAME=<Enter your Gmail address>
MAIL_PASSWORD=<Enter your Gmail password>
MAIL_ENCRYPTION=ssl
MAIL_FROM_ADDRESS=<Your Gmail Address>
MAIL_FROM_NAME=CustomAuth

注意不要使用引号(",',)或空格。另外, 你可能需要清除Laravel的缓存, 虽然这不是强制性的.要做到这一点, 在终端运行以下命令:

php artisan config:cache

你可以在这篇文章中找到更多关于使用Gmail SMTP发送邮件的信息。

要使用GMAIL作为SMTP服务器,你需要启用Less安全应用访问

设置模型和迁移

Laravel自带了一个默认的Model文件,叫做User.php,位于app/Models目录下,还有一个Migration文件,叫做2014_10_12_000000_create_users_table.php,位于数据库/migrations目录下。

更新User.php,修改表示可填充字段$fillable 数组,以符合下面的代码示例:

protected $fillable = [
    'email',
    'password',
];

然后,更新迁移文件的up() 方法,使其与下面的例子相匹配:

public function up()
{
    Schema::create('users', function (Blueprint $table) {
        $table->id();
        $table->string('email')->unique();
        $table->timestamp('email_verified_at')->nullable();
        $table->string('password');
        $table->rememberToken();
        $table->timestamps();
    });
}

设置认证

在本教程中,你将使用Laravel Sanctum,这是一个轻量级的认证系统,用于SPA(单页应用程序),移动应用程序和基于令牌的API,以限制对几个路线的访问。

使用Composer安装它,通过运行下面的命令:

composer require laravel/sanctum

接下来,使用下面的vendor:publish Artisan命令,将新的Sanctum配置和迁移文件发布到你的应用程序的config 目录:

php artisan vendor:publish --provider="Laravel\Sanctum\SanctumServiceProvider"

然后,在app/Http/Kernel.php中,将Sanctum的中间件添加到你的api 中间件组中,取消下面例子中的高亮行:

'api' => [
    \Laravel\Sanctum\Http\Middleware\EnsureFrontendRequestsAreStateful::class,
    'throttle:api',
    \Illuminate\Routing\Middleware\SubstituteBindings::class,
],

运行数据库迁移

完成这些修改后,接下来,运行下面的命令来执行数据库迁移并配置数据库:

php artisan migrate

添加电子邮件验证支持

注册成功后,用户会被提示检查他们的电子邮件(通过Mailable发送)是否有一个6位数的PIN。如果PIN码是匹配的,那么他们的电子邮件就被成功验证了,他们就会被重定向到主页。

要创建Mailable,app/Mail/VerifyEmail.php, 及其相应的视图模板,resources/views/emails/verify.blade.php,运行以下Artisan命令:

php artisan make:mail VerifyEmail --markdown=emails.verify

然后,打开app/Mail/VerifyEmail.php,更新__construct() 方法,以符合下面的代码:

public function __construct($pin)
{
    $this->pin=$pin;
}

然后,将下面这个成员变量添加到类的顶部:

public $pin;

$pin 被设置为公共成员变量,这样它就可以从 (很快就会被创建)传递到 '的构造函数。RegistrationController VerifyEmail

接下来,更新该类的build() 函数,以匹配下面的代码:

public function build()
{
    return $this
        ->subject("Email Verification")
        ->markdown('emails.verify');
}

之后,更新电子邮件视图模板,resources/views/emails/verify.blade.php,以匹配下面的代码:

@component('mail::message')
# Email Verification

Thank you for signing up. 
Your six-digit code is {{$pin}}

Thanks,<br>
{{ config('app.name') }}
@endcomponent

设置注册控制器

接下来,你需要创建一个控制器来注册用户,并向他们发送带有6位数PIN码的电子邮件,以便他们可以验证他们的电子邮件地址。要创建控制器,请运行以下命令:

php artisan make:controller RegisterController

这将在app/Http/Controllers目录下创建一个新文件RegisterController.php**。 接下来,在文件的顶部添加以下use 语句:

use App\Mail\VerifyEmail;
use App\Models\User;
use Carbon\Carbon;
use Illuminate\Http\JsonResponse;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\Mail;
use Illuminate\Support\Facades\Validator;

之后,通过在类中添加下面的代码来定义register() 方法:

public function register(Request $request)
{
    $validator = Validator::make($request->all(), [
        'email' => ['required', 'string', 'email', 'max:255', 'unique:users'],
        'password' => ['required', 'string', 'min:8', 'confirmed'],
    ]);

    if ($validator->fails()) {
        return new JsonResponse(['success' => false, 'message' => $validator->errors()], 422);
    }

    $user = User::create([       
        'email'         => $request->all()['email'],
        'password'      => Hash::make($request->all()['password']),
    ]);
    if ($user) {
        $verify2 =  DB::table('password_resets')->where([
            ['email', $request->all()['email']]
        ]);

        if ($verify2->exists()) {
            $verify2->delete();
        }
        $pin = rand(100000, 999999);
        DB::table('password_resets')
            ->insert(
                [
                    'email' => $request->all()['email'], 
                    'token' => $pin
                ]
            );
    }
    
    Mail::to($request->email)->send(new VerifyEmail($pin));
        
    $token = $user->createToken('myapptoken')->plainTextToken;
        
    return new JsonResponse(
        [
            'success' => true, 
            'message' => 'Successful created user. Please check your email for a 6-digit pin to verify your email.', 
            'token' => $token
        ], 
        201
    );
}

该代码在注册用户之前,首先验证所有需要的注册字段。验证规则包括:

  • 一个有效的电子邮件地址,并且是唯一的。
  • 一个至少有8个字符的密码。
  • 一个password_confirmation 字段,以便重新输入密码。

如果注册成功,将向注册的电子邮件地址发送一封带有6位数密码的电子邮件,用于电子邮件验证,并在响应中返回一个令牌。这个令牌被用来进行任何,未来的授权请求。

接下来,将下面的代码粘贴在register 方法之后,定义控制器的verifyEmail() 方法:

public function verifyEmail(Request $request)
{
    $validator = Validator::make($request->all(), [
        'token' => ['required'],
    ]);

    if ($validator->fails()) {
        return redirect()->back()->with(['message' => $validator->errors()]);
    }
    $select = DB::table('password_resets')
        ->where('email', Auth::user()->email)
        ->where('token', $request->token);

    if ($select->get()->isEmpty()) {
        return new JsonResponse(['success' => false, 'message' => "Invalid PIN"], 400);
    }

    $select = DB::table('password_resets')
        ->where('email', Auth::user()->email)
        ->where('token', $request->token)
        ->delete();

    $user = User::find(Auth::user()->id);
    $user->email_verified_at = Carbon::now()->getTimestamp();
    $user->save();

    return new JsonResponse(['success' => true, 'message' => "Email is verified"], 200);
}

这个方法验证从请求中获取的6位数PIN码是否与当前用户的电子邮件地址重置请求有关。如果是,那么密码重置请求被删除,用户的电子邮件被标记为已被验证。之后,会返回一个成功的响应。

如果没有提供令牌,或者令牌没有链接到用户的密码请求,那么用户会被重定向到RegistrationController ,并给出相应的错误信息。

增加重新发送密码的功能

如果6位数的密码重置PIN过期,用户可能想再申请一个。要做到这一点,在verifyEmail() 方法之后的RegisterController ,定义resendPin() 方法,添加以下代码:

public function resendPin(Request $request)
{
    $validator = Validator::make($request->all(), [
        'email' => ['required', 'string', 'email', 'max:255'],
    ]);

    if ($validator->fails()) {
        return new JsonResponse(['success' => false, 'message' => $validator->errors()], 422);
    }

    $verify =  DB::table('password_resets')->where([
        ['email', $request->all()['email']]
    ]);

    if ($verify->exists()) {
        $verify->delete();
    }

    $token = random_int(100000, 999999);
    $password_reset = DB::table('password_resets')->insert([
        'email' => $request->all()['email'],
        'token' =>  $token,
        'created_at' => Carbon::now()
    ]);

    if ($password_reset) {
        Mail::to($request->all()['email'])->send(new VerifyEmail($token));

        return new JsonResponse(
            [
                'success' => true, 
                'message' => "A verification mail has been resent"
            ], 
            200
        );
    }
}

该代码首先检查提交的电子邮件地址是否有效。如果它是有效的,并且已经与一个密码重置请求相关联,那么匹配的密码重置请求将被删除。

随后,一个新的令牌被生成,并与电子邮件地址一起被用来创建一个新的密码重置请求。如果请求被成功创建,那么该令牌将通过电子邮件发送给用户。此外,一个JSON响应通知用户,他们将收到一封带有重置令牌的电子邮件。

设置中间件

接下来要做的是创建一个新的中间件类 ,它将阻止用户访问其他路由,直到他们的电子邮件地址得到验证。要创建它,请运行以下命令:

php artisan make:middleware VerifyEmail

该命令将在app/Http/Middleware/中创建一个新的文件,VerifyEmail.php *。*文件创建后,在文件的顶部添加以下use 语句:

use Illuminate\Http\JsonResponse;
use Illuminate\Support\Facades\Auth;

然后,更新handle() 方法,以匹配以下代码:

public function handle(Request $request, Closure $next)
{
    if (Auth::user()->email_verified_at === null) {
        return new JsonResponse(
            [
                'success' => false, 
                'message' => 'Please verify your email before you can continue'
            ], 
            401
        );
    }
    return $next($request);
}

接下来,你需要将其链接到应用程序的路由中间件,在app/Http/Kernel.php中的$routeMiddleware 数组中添加下面突出的一行:

'verify.api'=> \App\Http\Middleware\VerifyEmail::class,

设置登录控制器

接下来,你需要创建一个具有登录和注销功能的控制器,通过运行以下命令:

php artisan make:controller LoginController

这将在app\Http\Controllers目录 下创建一个名为LoginController.php 的文件*。* 创建后,在文件的顶部添加以下use 语句:

use App\Models\User;
use Illuminate\Http\JsonResponse;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\Validator;

然后,通过复制以下代码到类的主体中来定义login()logout() 方法:

public function login(Request $request)
{
    $validator = Validator::make($request->all(), [
        'email' => ['required', 'string', 'email', 'max:255'],
        'password' => ['required', 'string', 'min:8'],
    ]);

    if ($validator->fails()) {
        return new JsonResponse(
            [
                'success' => false, 
                'message' => $validator->errors()
            ], 
            422
        );
    }

    $user = User::where('email', $request->all()['email'])->first();

    // Check Password
    if (!$user || !Hash::check($request->all()['password'], $user->password)) {
        return new JsonResponse(
            [
                'success' => false, 
                'message' => 'Invalid Credentials'
            ], 
            400
        );
    }

    $token = $user->createToken('myapptoken')->plainTextToken;
    return new JsonResponse(
            [
                'success' => true, 
                'token' => $token
            ], 
            200
        );
}

public function logout(Request $request)
{
    auth()->user()->tokens()->delete();

    return new JsonResponse(
        [
            'success' => true, 
            'message' =>'Logged Out Successfully'
        ], 
        200
    );

 }

login() 方法需要一个电子邮件地址和一个密码。在用户成功登录之前,电子邮件地址必须是有效的,并与密码相连。在成功登录后,一个新的令牌被分配给用户,以进行未经授权的请求。

logout() 方法删除了用户的令牌,这样他们就不会有授权访问,直到他们再次登录获得新的令牌。

添加密码重置支持

在允许用户改变他们的密码之前--特别是在他们没有登录的时候--必须提供一种方法来确保用户是有效的并且拥有这个账户。

一个好的方法是使用Mailable向注册的电子邮件地址发送一个确认的PIN。如果用户提交了正确的PIN码,他们就可以重置他们的密码。

创建一个重置密码的Mailable

通过运行以下命令,在app/Mail/ResetPassword.php 中创建Mailable,并在resources/views/emails/password.blade.php中创建其相应的视图模板:

php artisan make:mail ResetPassword --markdown=emails.password

创建了这些文件后,打开app/Mail/ResetPassword.php并更新__construct() 方法,如下所示:

public function __construct($pin)
{
    $this->pin=$pin;
}

然后,在类的顶部定义$pin 类成员变量:

public $pin;

接下来,更新`build()`方法,如下所示:

public function build()
{
    return $this->subject("Reset Password")->markdown('emails.password');
}

然后,更新resources/views/emails/password.blade.php中的邮件视图模板,如下所示:

@component('mail::message')
# Reset Password

Your six-digit PIN is <h4>{{$pin}}</h4>
<p>Please do not share your One Time Pin With Anyone. You made a request to reset your password. Please discard if this wasn't you.</p>

Thanks,<br>
{{ config('app.name') }}
@endcomponent

设置忘记密码控制器

接下来,你需要创建一个控制器来帮助用户重置密码,通过电子邮件向他们发送重置密码的密码。要做到这一点,请运行以下命令。

php artisan make:controller ForgotPasswordController

它将在app/Http/Controllers目录下创建一个名为ForgotPasswordController.php的新文件。创建后,在文件的顶部添加必要的use 语句:

use App\Mail\ResetPassword;
use App\Models\User;
use Carbon\Carbon;
use Illuminate\Http\JsonResponse;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Mail;
use Illuminate\Support\Facades\Validator;

接下来,定义forgotPassword() 方法,将下面的代码粘贴到该类中:

public function forgotPassword(Request $request)
{
    $validator = Validator::make($request->all(), [
        'email' => ['required', 'string', 'email', 'max:255'],
    ]);

    if ($validator->fails()) {
        return new JsonResponse(['success' => false, 'message' => $validator->errors()], 422);
    }

    $verify = User::where('email', $request->all()['email'])->exists();

    if ($verify) {
        $verify2 =  DB::table('password_resets')->where([
            ['email', $request->all()['email']]
        ]);

        if ($verify2->exists()) {
            $verify2->delete();
        }

        $token = random_int(100000, 999999);
        $password_reset = DB::table('password_resets')->insert([
            'email' => $request->all()['email'],
            'token' =>  $token,
            'created_at' => Carbon::now()
        ]);

        if ($password_reset) {
            Mail::to($request->all()['email'])->send(new ResetPassword($token));

            return new JsonResponse(
                [
                    'success' => true, 
                    'message' => "Please check your email for a 6 digit pin"
                ], 
                200
            );
        }
    } else {
        return new JsonResponse(
            [
                'success' => false, 
                'message' => "This email does not exist"
            ], 
            400
        );
    }
}

forgotPassword() 方法验证请求中发送的电子邮件地址,并检查它是否与现有用户相关联,以及它是否与重置密码请求相关联。如果是,那么当前的重置密码请求将被替换成另一个。然后,它完成了向用户邮寄重置密码的电子邮件,其中包含重置密码的密码。

接下来,在forgotPassword 方法之后,添加下面的verifyPin() 方法:

public function verifyPin(Request $request)
{
    $validator = Validator::make($request->all(), [
        'email' => ['required', 'string', 'email', 'max:255'],
        'token' => ['required'],
    ]);

    if ($validator->fails()) {
        return new JsonResponse(['success' => false, 'message' => $validator->errors()], 422);
    }

    $check = DB::table('password_resets')->where([
        ['email', $request->all()['email']],
        ['token', $request->all()['token']],
    ]);

    if ($check->exists()) {
        $difference = Carbon::now()->diffInSeconds($check->first()->created_at);
        if ($difference > 3600) {
            return new JsonResponse(['success' => false, 'message' => "Token Expired"], 400);
        }

        $delete = DB::table('password_resets')->where([
            ['email', $request->all()['email']],
            ['token', $request->all()['token']],
        ])->delete();

        return new JsonResponse(
            [
                'success' => true, 
                'message' => "You can now reset your password"
            ], 
            200
            );
    } else {
        return new JsonResponse(
            [
                'success' => false, 
                'message' => "Invalid token"
            ], 
            401
        );
    }
}

这个方法需要用户的电子邮件地址和发给他们的6位数的密码,在用户要求重置密码之后。如果密码没有过期,并且与用户的电子邮件地址的重置密码请求有关,则允许用户重置他们的密码。否则会返回一个适用的错误信息。

设置重置密码控制器

接下来,你需要创建一个控制器来重置用户的密码。要创建控制器,请运行以下命令:

php artisan make:controller ResetPasswordController

它将在app/Http/Controllers目录下创建一个名为ResetPasswordController.php的新文件。创建后,在文件的顶部添加以下use 语句:

use App\Models\User;
use Illuminate\Http\JsonResponse;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\Validator;

然后,通过在类的主体中添加下面的代码,实现resetPassword() ,该方法允许用户重置他们的密码:

public function resetPassword(Request $request)
{        
    $validator = Validator::make($request->all(), [
        'email' => ['required', 'string', 'email', 'max:255'],
        'password' => ['required', 'string', 'min:8', 'confirmed'],
    ]);

    if ($validator->fails()) {
        return new JsonResponse(['success' => false, 'message' => $validator->errors()], 422);
    }

    $user = User::where('email',$request->email);
    $user->update([
        'password'=>Hash::make($request->password)
    ]);

    $token = $user->first()->createToken('myapptoken')->plainTextToken;

    return new JsonResponse(
        [
            'success' => true, 
            'message' => "Your password has been reset", 
            'token'=>$token
        ], 
        200
    );
}

设置所需的路由

Laravel的路由存储在web应用的路由/web.php 和API的路由/api.php 中。在本指南中, 你将会把它们存储在routes/api.php中。

注销路由将受到authveriify.api 中间件的保护,因为只有登录的用户才能注销,而且只有经过验证的用户才能访问其他端点。验证电子邮件路线将用auth 中间件来保护。其他路由不需要用户被认证或验证,所以不需要被任何中间件保护。

要做到这一点,请将下面的路由定义添加到rouse/api.php的末尾:

Route::post(
    '/register', 
    [App\Http\Controllers\RegisterController::class, 'register']
)->name('register');

Route::match(
    ['get', 'post'], 
    '/login', 
    [App\Http\Controllers\LoginController::class, 'login']
)->name('login');

Route::post(
    '/resend/email/token', 
    [App\Http\Controllers\RegisterController::class, 'resendPin']
)->name('resendPin');

Route::middleware('auth:sanctum')->group(function () {
    Route::post(
        'email/verify',
        [App\Http\Controllers\RegisterController::class, 'verifyEmail']
    );
    Route::middleware('verify.api')->group(function () {
        Route::post(
            '/logout', 
            [App\Http\Controllers\LoginController::class, 'logout']
        );
    });
});

Route::post(
    '/forgot-password', 
    [App\Http\Controllers\ForgotPasswordController::class, 'forgotPassword']
);
Route::post(
    '/verify/pin', 
    [App\Http\Controllers\ForgotPasswordController::class, 'verifyPin']
);
Route::post(
    '/reset-password', 
    [App\Http\Controllers\ResetPasswordController::class, 'resetPassword']
);

verifyEmaillogout 路由已经被sanctum 认证保护auth:sanctum 。这确保只有经过认证的用户才能访问它们。

测试应用程序

在创建了API之后,是时候对其进行测试并确认其功能是否正常。有多种方法可以做到这一点,例如使用PostmancURL,但我们将使用Postman。

然而,在这之前,我们要通过运行下面的命令来启动该应用程序:

php artisan serve

测试注册功能

要做的第一件事是测试注册和登录功能。要做到这一点,在Postman中使用URLhttp://localhost:8000/api/register 创建一个新的POST请求。然后,在Body标签下:

  • 选择 "form-data" 编码类型
  • 添加一个请求变量,email ,并将其设置为你的电子邮件地址。
  • 添加第二个请求变量,password ,并将其设置为你的密码。它的复杂性并不重要,但它必须至少有8个字符长
  • 添加第三个请求变量,password_confirmation ,并将其设置为与你输入的password 相同的值。

配置好请求后,点击发送即可发送。你应该在Postman的响应体中看到一个类似于下面的JSON响应。

Register with Postman

测试验证电子邮件的功能

要做到这一点,你需要三样东西:

  1. 你注册时使用的电子邮件地址。
  2. 通过电子邮件发给你的6位数的PIN码。
  3. 认证令牌。你可以在你刚刚完成的登录请求响应中的token 字段中找到。这是必须的,因为验证电子邮件端点是受保护的。

Verify email with Postman

使用URLhttp://localhost:8000/api/email/verify 在Postman中创建一个新的POST请求。

然后,在Body标签下:

  • 选择 "form-data" 编码类型
  • 添加一个请求变量,email ,并将其值设置为你注册的电子邮件地址。
  • 添加另一个请求变量,token ,并将其值设置为通过电子邮件发送给你的6位数的PIN码。

然后,在授权标签下(在较新版本的Postman中,它被命名为Auth):

  • 将"类型 "下拉列表改为**"承载令牌"**
  • 将"Token "字段的值设置为登录请求响应的token 字段中返回的令牌。

然后,通过点击发送来提交请求。如果成功,你应该看到一个类似于下面例子的响应体:

{
        "success": true,
        "message": "Email is verified"
}

测试登录功能

接下来,让我们测试一下登录功能。要做到这一点,在Postman中使用URLhttp://localhost:8000/api/login 创建一个新的POST请求。然后,在Body标签下。

  • 选择 "原始 "编码类型
  • 在编码类型下拉菜单中,将 "TEXT "改为 "JSON"
  • 用你的电子邮件地址和密码替换下面JSON中的占位符,并将其作为请求的正文粘贴。
{
    "email": "<your email address>",
    "password": "<your password>"
}

然后,通过点击发送提交请求。如果成功,你应该看到一个类似于下面截图的响应体。

Login with Postman

测试注销功能

要做到这一点,在Postman中创建一个新的POST请求,使用URLhttp://localhost:8000/api/logout

然后,在 "授权"标签下:

  • 将"类型 "下拉列表改为"承载令牌"
  • 将"令牌 "字段的值设置为登录请求响应的token 字段中返回的令牌。

Logout with Postman

然后,通过点击发送来提交请求。如果成功,你应该看到一个类似于下面例子的响应体。

{
    "success": true,
    "message": "Email is verified"
}

测试密码重置功能

继续测试密码重置,首先你需要请求6位数的PIN码,然后就可以重置密码。唯一需要的字段是email

要做到这一点,在Postman中创建一个新的POST请求,使用URLhttp://localhost:8000/api/reset-password 。然后,在Body标签下:

  • 选择"form-data"编码类型
  • 添加一个请求变量,email ,并将其值设置为你注册的电子邮件地址。

Test password reset with Postman

然后,通过点击发送来提交请求。如果成功,你应该看到一个类似于下面例子的响应体。

{
    "success": true,
    "message": "Please check your email for a 6 digit pin"
}

接下来,提交你通过电子邮件收到的PIN码进行验证。要做到这一点,在Postman中创建一个新的POST请求,使用URLhttp://localhost:8000/api/verify/pin 。然后,在Body标签下:

  • 选择"form-data "编码类型
  • 添加一个请求变量,email ,并将其值设置为你注册的电子邮件地址。
  • 添加另一个请求变量,token ,并将其值设置为刚刚通过电子邮件发送给你的6位数的密码,在重置密码的电子邮件中。

Test verify pin with Postman

然后,通过点击发送来提交请求。如果成功,你应该看到一个类似于下面例子的响应体。

{
    "success": true,
    "message": "You can now reset your password"
}

由于密码已被验证,你现在可以重置你的密码。要做到这一点,在Postman中创建一个新的POST请求,使用URLhttp://localhost:8000/api/reset-password 。然后,在Body标签下:

  • 选择 "form-data" 编码类型
  • 添加一个请求变量,email ,并将其值设置为你注册的电子邮件地址。
  • 添加第二个请求变量,password ,并将其值设置为你的新密码。
  • 添加第三个请求变量,password_confirmation ,并将其值也设置为你的新密码。

Test reset password with Postman

然后,通过点击发送来提交请求。如果成功,你应该看到一个与下面的例子类似的响应体。

{
    "success": true,
    "message": "Your password has been reset",
    "token": "11|V11TAqTwLfKNsVyrJz47sOsbLuQI9CmRGZibwexj"
}

总结

在本教程中, 你学到了如何在Laravel中创建自定义的忘记密码和电子邮件验证功能.查看官方文档,了解更多关于Laravel默认的电子邮件验证重置密码。这个项目的代码是开源的,可以在GitHub上找到。