Day02-CRUD API 实作(二)Laravel Sanctum 会员注册、登入、登出

大家好~
今天要来使用 Laravel Sanctum 实作会员系统!

实作过程

建立 Controller

使用 php artisan make:controller 建立一个 AuthController。

在刚刚建立的 AuthController 内 use App\Models\User 与其他会用到的 class。

use App\Models\User;
use Illuminate\Http\Request;
use Illuminate\Http\Response;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Hash;

use Illuminate\Http\Response; 是个人习惯,
该 class extends vendor/symfony/http-foundation/Response.php
vendor/symfony/http-foundation/Response.php 内定义了 HTTP Status Code 常量。
下图为 vendor/symfony/http-foundation/Response.php 内部分截图。

注册

  • 流程:
    1. 验证 Request 表单
    2. 建立新 User
    3. 建立该 User 的 Token
    4. 回传 Response
public function register(Request $request)
{
    $validated = $request->validate([
        'name' => 'required|string',
        'email' => 'required|email|unique:users,email',
        'password' => 'required|string|min:8',
    ]);

    $user = User::create([
        'name' => $validated['name'],
        'email' => $validated['email'],
        'password' => Hash::make($validated['password'])
    ]);

    $token = $user->createToken('token')->plainTextToken;
    
    return [
        'user' => $user,
        'token' => $token
    ];
}

表单验证

Laravel Validation 提供许多验证规则使我们可以轻松的对 Request 内的表单验证。

Hash::make()

Laravel 预设会是使用 bcrypt 做 hash。
Laravel 支援 bcrypt、argon、argon2id,
可以在 config/hashing.php 做变更。
vendor/laravel/framework/src/Illuminate/Hashing/HashManager.php

建立 token

使用 HasApiTokens 这个 trait 内的 createToken() 为 user 建立 token。
下图是 createToken() 的原始码。

使用 plainTextToken 可以调用未 hash 前的 token。

登入

  • 流程:
    1. 验证 Request 表单
    2. 比对 Email 与 Password 有无不符
    3. 建立该 User 的 Token
    4. 回传 Response
public function login(Request $request)
{
    $validated = $request->validate([
        'email' => 'required|email',
        'password' => 'required|string|min:8'
    ]);

    $user = User::where('email', $validated['email'])->first();
    
    if (!$user || !Hash::check($validated['password'], $user['password'])) {
        return response([
            'message' => 'The provided credentials are incorrect.'
        ], Response::HTTP_UNAUTHORIZED);
    }

    $token = $user->createToken('apiToken')->plainTextToken;
    
    return response([
        'user' => $user,
        'token' => $token
    ], Response::HTTP_CREATED);
}

Hash::check()

使用 Hash::check() 将 Request 内的 password 与 资料库内 Hash 过的 password 进行比对。
第一个参数为未 hash 的,
第二个参数为已 hash 过的。
vendor/laravel/framework/src/Illuminate/Hashing/HashManager.php

登出

  • 流程:
    1. 将 Token 删除
    2. 回传 Response
public function logout()
{
    Auth::user()->tokens()->delete();
    
    return  response([
        'message' => 'Logged out.'
    ],Response::HTTP_OK);
}

Auth::user()->tokens()->delete();

Auth::user() 可以取得已认证的 User,
然後使用 HasApiTokens trait 提供的 tokens 关联关系从数据库删除 token

那麽会员的注册、登入、登出就完成了!
明天再来帮会员系统设定 Routes 并且用 Postman 测试会员系统吧!

大家明天见啦~
若文章有任何问题,
还请大家不吝赐教!

参考资料


<<:  [Lesson2] Android Studio安装

>>:  [履历]准备履历不只是为了面试!

不只懂 Vue 语法:为什麽需要使用 $nextTick ?

问题回答 $nextTick 的作用是等待画面更新後才执行程序,因为有些时候我们需要操作画面上的 D...

人脸辨识-day26

在人脸辨识中,常见的是用影像的方式来进行辨识,利用摄影机的方式来撷取影像,利用相似的方式让测试者与资...

D3JsDay05Bar拉BarBarBar,作伙来画吧—画个bar chart长条图

用D3绘制长条图 我们现在可以尝试着用已经学到的SVG来画长条图,只不过是透过D3Js的操作来新增S...

【第十二天 - Flutter NetWork 网路判断】

前言 今日的程序码 => GIHUB 说明 这是一个网路判断的一个范例,将会使用 data_c...

Day18-持久不一定需要防腐剂 stateful redis建立

前面有特别提到,redis这类应用程序如果需要保持资料持久化,不会因为重启pod造成资料消失,就必须...