Laravel Restful API with JWT Authentication

更新於 2024/11/07閱讀時間約 10 分鐘

本筆記遵循官方文件教學,經過一些小修改,經測試可以跑在Laravel Framework version: 8.13.0,將筆記記錄下來。

Laravel installation

1. 使用composer安裝JWT:
如同這邊提到的: https://github.com/tymondesigns/jwt-auth/releases/tag/1.0.1
tymon/jwt-auth這個jwt套件目前最新版本為1.0.1,兼容支援Laravel 8。

在專案目錄下,下這個指令來安裝指定版本:
$ composer require tymon/jwt-auth "1.0.1"

2. Publish the config
發佈軟件包配置文件:
$ php artisan vendor:publish --provider="Tymon\JWTAuth\Providers\LaravelServiceProvider"

執行指令完畢後,會在config folder中產生一個jwt.php檔案,裡面有一些基本設定。
3. 產生secret key

$ php artisan jwt:secret
這個指令會更新.env檔案,新增類似JWT_SECRET=foobar的東西。
這個secret key是用來簽署token的,根據選擇的演算法來簽名。

Quick start


1. 更新user model
加入
(1)use Tymon\JWTAuth\Contracts\JWTSubject;
(2) implements JWTSubject
(3) getJWTIdentifier(), getJWTCustomClaims()兩個method。
(4) table name若不是users,記得改一下。
2. Configure Auth guard
修改config/auth.php,原本為:
改為如紅框這樣:
3. 新增基本認證Routes
在routes/api.php加入:
use App\Http\Controllers\AuthController;
Route::group([
      'middleware' => 'api',
      'prefix' => 'user'
    ], function ($router) {
      Route::post('login', [AuthController::class, 'login']);
      Route::post('logout', [AuthController::class, 'logout']);
      Route::post('refresh', [AuthController::class, 'refresh']);
      Route::post('me', [AuthController::class, 'me']);
});
4. 建立AuthController
$ php artisan make:controller AuthController
其中__construct中的那一行,意思是除了login這個method以外,其他api都要帶上access token才能存取!
$this->middleware('auth:api')=>表示使用auth middleware,傳入api參數。
5.Config DB
參考Laravel 8 Hello World這篇,不再贅述。
6.測試JWT
現在可以post到login這個endpoint測試看看:
http://localhost/laravel_jwt/public/api/user/login
可以看到在登入成功後,server會response一組access token給前端。
其中,在AuthController的login method中驗證使用者帳密,需特別注意資料庫中的密碼要使用BCrypt演算法來加密,如上圖該密碼即為123加密後的結果。
登入後,打http://localhost/laravel_jwt/public/api/user/me,header中帶上Authorization: Bearer ${access_token},就可以拿到user資料了!
在登入狀態下refresh,可以換新token:
http://localhost/laravel_jwt/public/api/user/refresh
接著測試登出:http://localhost/laravel_jwt/public/api/user/logout
由於剛剛有refresh,token要換成新的。
值得一提的是,在login之後,所有其他api(me/logout/refresh),都須在header帶上access token,才能存取。

最後我們新增一個文章api,來測試看看。
建構子中這行$this->middleware('auth:api'); => 表示使用auth middleware,傳入api參數。
所以會先經過中間層,來驗證前端有無帶正確token過來。
這個middleware其實是定義在這:
然後我們打一下article api,故意不帶token:
這是因為L18這行出現exception,為了讓api 更完善,修改一下app\Http\Middleware\Authenticate.php:
<?php
namespace App\Http\Middleware;
use Illuminate\Auth\Middleware\Authenticate as Middleware;
class Authenticate extends Middleware
{
    protected function authenticate($request, array $guards){
        try{
            parent::authenticate($request, $guards);
        } catch (AuthenticationException $e){
            throw new UnauthorizedHttpException('JWTAuth', $e->getMessage());
        }
    }
}
再改一下app\Exceptions\Handler.php,加入紅框程式碼:
use Illuminate\Auth\AuthenticationException;
protected function unauthenticated($request, AuthenticationException $exception){
        return response()->json(['error' => 'Unauthenticated.'], 401);
}
接著我們打一下article api,故意不帶token,或者token故意帶錯誤的:
這樣處理看起來好多了,沒帶token或者token錯誤都會回401。

後記:
若要改User model name,可在config/auth.php中找到這段User::class,改成你的Xxx::class。
AuthController login method 中的 auth()->attempt($credentials),就是直接拿這邊設定的model data來驗證。

若遇到這個錯誤:
TypeError: Argument 3 passed to Lcobucci\JWT\Signer\Hmac::doVerify() must be an instance of Lcobucci\JWT\Signer\Key, null given
解法:
$ php artisan key:generate
$ php artisan jwt:secret
即將進入廣告,捲動後可繼續閱讀
為什麼會看到廣告
avatar-img
21會員
161內容數
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
Vic Lin的沙龍 的其他內容
JWT全名JSON Web Token,因符合RESTful API無狀態原則而誕生。 傳統我們通常會用cookie/session的方式來做身分認證,也就是user登入後,用session id當作一種token,來做身份認證。 然而用session這種方法server會有額外的儲存負擔...
本文模擬user註冊的情境來簡單演示,在Laravel中如何透過ajax來存取資料,以post request為例。 前端透過post把user資料送到controller中,並且透過model把資料塞進DB,最後回傳json response。 完整source cod
Laravel Framework version: 8.12.3 本範例做了兩個,一個是進到首頁顯示hello world!,另一個是進到article頁面時,從資料庫把文章抓出來顯示。 ...
Note: 本筆記使用的是Windows 10作業系統 1. 下載並安裝WAMP或XAMPP等等 本文是使用wamp,這邊略過安裝教學。 2. 下載並安裝Composer 至官網下載Composer windows installer,到這一步驟時,選擇PHP版本位置: ...
假如你開發了一個網站,有user登入的功能,駭客故意輸入SQL語法來破壞原本的SQL結構,這就是SQL注入攻擊。
CSRF全名為 Cross Site Request Forgery( 跨站請求偽造)。
JWT全名JSON Web Token,因符合RESTful API無狀態原則而誕生。 傳統我們通常會用cookie/session的方式來做身分認證,也就是user登入後,用session id當作一種token,來做身份認證。 然而用session這種方法server會有額外的儲存負擔...
本文模擬user註冊的情境來簡單演示,在Laravel中如何透過ajax來存取資料,以post request為例。 前端透過post把user資料送到controller中,並且透過model把資料塞進DB,最後回傳json response。 完整source cod
Laravel Framework version: 8.12.3 本範例做了兩個,一個是進到首頁顯示hello world!,另一個是進到article頁面時,從資料庫把文章抓出來顯示。 ...
Note: 本筆記使用的是Windows 10作業系統 1. 下載並安裝WAMP或XAMPP等等 本文是使用wamp,這邊略過安裝教學。 2. 下載並安裝Composer 至官網下載Composer windows installer,到這一步驟時,選擇PHP版本位置: ...
假如你開發了一個網站,有user登入的功能,駭客故意輸入SQL語法來破壞原本的SQL結構,這就是SQL注入攻擊。
CSRF全名為 Cross Site Request Forgery( 跨站請求偽造)。
你可能也想看
Google News 追蹤
Thumbnail
*合作聲明與警語: 本文係由國泰世華銀行邀稿。 證券服務係由國泰世華銀行辦理共同行銷證券經紀開戶業務,定期定額(股)服務由國泰綜合證券提供。   剛出社會的時候,很常在各種 Podcast 或 YouTube 甚至是在朋友間聊天,都會聽到各種市場動態、理財話題,像是:聯準會降息或是近期哪些科
Thumbnail
Simple Storage Service (S3) 是 AWS 最常應用到的服務,只要是需要將檔案上傳到雲端的狀況都可以使用S3,本篇文章將介紹如何設定與使用AWS S3。
Thumbnail
在使用laravel中的Queue job的時候 如果希望job中斷還可以重新啟動這個時候就會需要用到Supervisor了 本篇文章為您帶來如何使用Supervisor執行Laravel的queue:work的教學
Thumbnail
有的時候,會希望在物件導向中對原生的Class新增功能的時候,大多我們都會寫一個新的class並繼承。 但是其實Laravel提供了一個不同的方式,讓我們可以在常用的Class上,直接新增想要的function,那就是macro。
Migration在 Laravel 中是一種用來管理資料庫結構變更的機制。它的主要目的是使開發者能夠在應用程序的不同環境中保持資料庫結構的一致性,並輕鬆地進行結構變更
Thumbnail
待業中後,發現時間變很多就開始東看看西看看,思考著要如何更深入理解Laravel框架的運用,而在Laravel框架中哪些部分是框架替我們做了哪些處理,推薦一個影片給大家一起學習理解。
Thumbnail
*合作聲明與警語: 本文係由國泰世華銀行邀稿。 證券服務係由國泰世華銀行辦理共同行銷證券經紀開戶業務,定期定額(股)服務由國泰綜合證券提供。   剛出社會的時候,很常在各種 Podcast 或 YouTube 甚至是在朋友間聊天,都會聽到各種市場動態、理財話題,像是:聯準會降息或是近期哪些科
Thumbnail
Simple Storage Service (S3) 是 AWS 最常應用到的服務,只要是需要將檔案上傳到雲端的狀況都可以使用S3,本篇文章將介紹如何設定與使用AWS S3。
Thumbnail
在使用laravel中的Queue job的時候 如果希望job中斷還可以重新啟動這個時候就會需要用到Supervisor了 本篇文章為您帶來如何使用Supervisor執行Laravel的queue:work的教學
Thumbnail
有的時候,會希望在物件導向中對原生的Class新增功能的時候,大多我們都會寫一個新的class並繼承。 但是其實Laravel提供了一個不同的方式,讓我們可以在常用的Class上,直接新增想要的function,那就是macro。
Migration在 Laravel 中是一種用來管理資料庫結構變更的機制。它的主要目的是使開發者能夠在應用程序的不同環境中保持資料庫結構的一致性,並輕鬆地進行結構變更
Thumbnail
待業中後,發現時間變很多就開始東看看西看看,思考著要如何更深入理解Laravel框架的運用,而在Laravel框架中哪些部分是框架替我們做了哪些處理,推薦一個影片給大家一起學習理解。