iT邦幫忙

2021 iThome 鐵人賽

DAY 2
0
Software Development

Laravel 新手初見 API系列 第 2

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 測試會員系統吧!

大家明天見啦~
若文章有任何問題,
還請大家不吝賜教!

參考資料


上一篇
Day01-CRUD API 實作(一)事前規劃、Laravel Sanctum 安裝與設定
下一篇
Day03-CRUD API 實作(三)Route、Postman 測試 API
系列文
Laravel 新手初見 API30

尚未有邦友留言

立即登入留言