Laravel 8 RESTful Web API 登入認證令牌 JSON Web Token (JWT)

Laravel 8 搭配 tymon/jwt-auth 套件實作完整的 RESTful Web API 登入認證令牌 JSON Web Token (JWT),包含使用者註冊、登入、以 JWT 認證使用 API、更新 JWT 及使用者登出時移除 JWT。
資料庫
使用瀏覽器開啟 phpMyAdmin,在 MariaDB 或 MySQL 新建一個資料庫名稱 laravel_db,編碼與排序使用 utf8mb4_unicode_ci。

Laravel 8 資料庫設定
修改檔案 .env 中第 4 行 DB_DATABASE。(資料庫名稱可自訂,只要與 DB_DATABASE 對應即可)
自動新增預設資料表:
Migration table created successfully.
Migrating: 2014_10_12_000000_create_users_table
Migrated: 2014_10_12_000000_create_users_table (12.28ms)
Migrating: 2014_10_12_100000_create_password_resets_table
Migrated: 2014_10_12_100000_create_password_resets_table (13.91ms)
Migrating: 2019_08_19_000000_create_failed_jobs_table
Migrated: 2019_08_19_000000_create_failed_jobs_table (16.50ms)
Migrating: 2019_12_14_000001_create_personal_access_tokens_table
Migrated: 2019_12_14_000001_create_personal_access_tokens_table (28.56ms)
這時查看資料庫會發現多了 5 個資料表 failed_jobs、migrations、password_resets、personal_access_tokens 和 users。

JWT
安裝 JWT (JSON Web 令牌) 套件。
# 以上省略 ...
> @php artisan vendor:publish --tag=laravel-assets --ansi
No publishable resources for tag [laravel-assets].
Publishing complete.
將 config/app.php 的 Laravel service providers 和 aliases 各自 include Tymon\JWTAuth 和 JWTAuth、JWTFactory 至結尾:
產生 config/jwt.php 設定檔:
# 以上省略 ...
Copied File [/vendor/tymon/jwt-auth/config/config.php] To [/config/jwt.php]
Publishing complete.
產生 secret key (JWT 密鑰):
jwt-auth secret [whyGL2aPpZlYPiyBTvWDT0hWNq9Lk5OG2V5J979qru8ICfg0DYMsR98ALoKNb1Kk] set successfully.
成功後會將產生的 secret key 存放在檔案 .env 結尾中:
JWT_SECRET=whyGL2aPpZlYPiyBTvWDT0hWNq9Lk5OG2V5J979qru8ICfg0DYMsR98ALoKNb1Kk
設定
修改 app/Models/User.php:
use Tymon\JWTAuth\Contracts\JWTSubject;
。class
宣告要implements JWTSubject
。- 結尾加入兩個 function,
getJWTIdentifier()
和getJWTCustomClaims()
。
修改 config/auth.php:
- 17 行:原 web 改為 api。
- 44~48 行:新增的程式。
建立 Controller
建立認證的 Authentication Controller:
Controller created successfully.
將下列所有程式碼複製貼上 app/Http/Controllers/AuthController.php:
路由
設定 routes/api.php,第 6 行、24 ~ 33 行為新增的程式碼:
測試
先到 Download Postman | Get Started for Free 下載並安裝可以發送和接收 HTTP 請求的軟體。
使用者註冊
使用者註冊網址 https://laravel8-jwt.footmark.com.tw/api/auth/register,使用 POST 在 Body 傳送給伺服器的資訊。
Postman POST 使用者註冊,回傳註冊成功資訊:

使用者登入
使用者註冊登入網址 https://laravel8-jwt.footmark.com.tw/api/auth/login,使用 POST 在 Body 傳送給伺服器的資訊。
Postman POST 使用者登入,回傳 JWT tokin 如下紅框,後續要請求的 API 都得發送這個 tokin,來讓 Laravel 確認您有權限能使用 API。

以 JWT token 使用 API 取得使用者資訊
以 JWT token 使用 API 取得使用者資訊網址 https://laravel8-jwt.footmark.com.tw/api/auth/user-profile,使用 GET 而 Auth 認證類型須使用 Bearer Token,並將上述取得的 Token 複製並貼至右則的 Token 欄位。
如果 JWT Token 認證沒有問題,則 API 就會回傳使用者資訊。

使用者更新 JWT token
更新 JWT token 網址 https://laravel8-jwt.footmark.com.tw/api/auth/refresh,使用 POST 而 Auth 認證類型須使用 Bearer Token,並將上述取得的 Token 複製並貼至右則綠框的 Token 欄位。
紅框為 API 回傳的新 Token,後續 API 認證就要使用這個新 Token 了。

使用者登出,移除 JWT token
使用者登出,移除 JWT token 網址 https://laravel8-jwt.footmark.com.tw/api/auth/logout,使用 POST 而 Auth 認證類型須使用 Bearer Token,並將上述取得的 Token 複製並貼至右則的 Token 欄位。
紅框顯示使用者已登出,因為 Tokin 已刪除無法使用了。

參考

本著作係採用創用 CC 姓名標示-相同方式分享 3.0 台灣 授權條款授權.