Laravel Restful API with JWT Authentication

更新 發佈閱讀 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的,根據選擇的演算法來簽名。

vocus|新世代的創作平台

Quick start


1. 更新user model

加入
(1)use Tymon\JWTAuth\Contracts\JWTSubject;
(2) implements JWTSubject
(3) getJWTIdentifier(), getJWTCustomClaims()兩個method。
(4) table name若不是users,記得改一下。

vocus|新世代的創作平台
vocus|新世代的創作平台

2. Configure Auth guard

修改config/auth.php,原本為:

vocus|新世代的創作平台

改為如紅框這樣:

vocus|新世代的創作平台

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']);
});


vocus|新世代的創作平台

4. 建立AuthController
$ php artisan make:controller AuthController


加入以下程式碼:
https://gist.github.com/snailsmall612/eef2082a9fae6a5943bee127eacc12cc

其中__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

vocus|新世代的創作平台


vocus|新世代的創作平台

可以看到在登入成功後,server會response一組access token給前端。
其中,在AuthController的login method中驗證使用者帳密,需特別注意資料庫中的密碼要使用BCrypt演算法來加密,如上圖該密碼即為123加密後的結果。

登入後,打http://localhost/laravel_jwt/public/api/user/me,header中帶上Authorization: Bearer ${access_token},就可以拿到user資料了!

vocus|新世代的創作平台

在登入狀態下refresh,可以換新token:
http://localhost/laravel_jwt/public/api/user/refresh

vocus|新世代的創作平台


接著測試登出:http://localhost/laravel_jwt/public/api/user/logout
由於剛剛有refresh,token要換成新的。

vocus|新世代的創作平台

值得一提的是,在login之後,所有其他api(me/logout/refresh),都須在header帶上access token,才能存取。


最後我們新增一個文章api,來測試看看。

vocus|新世代的創作平台
vocus|新世代的創作平台
vocus|新世代的創作平台
vocus|新世代的創作平台

建構子中這行$this->middleware('auth:api'); => 表示使用auth middleware,傳入api參數。
所以會先經過中間層,來驗證前端有無帶正確token過來。

這個middleware其實是定義在這:

vocus|新世代的創作平台
vocus|新世代的創作平台

然後我們打一下article api,故意不帶token:

vocus|新世代的創作平台

這是因為L18這行出現exception,為了讓api 更完善,修改一下app\Http\Middleware\Authenticate.php:

vocus|新世代的創作平台
<?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,加入紅框程式碼:

vocus|新世代的創作平台
use Illuminate\Auth\AuthenticationException;
vocus|新世代的創作平台
protected function unauthenticated($request, AuthenticationException $exception){
return response()->json(['error' => 'Unauthenticated.'], 401);
}


接著我們打一下article api,故意不帶token,或者token故意帶錯誤的:

vocus|新世代的創作平台

這樣處理看起來好多了,沒帶token或者token錯誤都會回401。

完整Source code: https://github.com/snailsmall612/laravel-jwt


後記:

若要改User model name,可在config/auth.php中找到這段User::class,改成你的Xxx::class。

vocus|新世代的創作平台

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


本筆記參考:
1. https://jwt-auth.readthedocs.io/en/develop/
2. https://github.com/tymondesigns/jwt-auth/issues/1226
3. https://medium.com/@ZtuX/how-to-change-your-authentication-model-in-laravel-5-3-7a580a727d6f
4. https://stackoverflow.com/questions/53379271/jwt-authentication-error-argument-3-passed-to-lcobucci-jwt-signer-hmacdoverify

留言
avatar-img
Vic Lin的沙龍
20會員
161內容數
Vic Lin的沙龍的其他內容
2023/08/13
父元件 傳遞方法使用@ <template>    ...    <Login @modalClose="modalClose"/> ... </template> <script setup>     const _modal = ref();     function m
2023/08/13
父元件 傳遞方法使用@ <template>    ...    <Login @modalClose="modalClose"/> ... </template> <script setup>     const _modal = ref();     function m
2023/03/25
前情提要 由於我的筆電已經用了10年,無法再戰下去了,且有預算考量,加上使用電腦幾乎都是定點,只有偶爾回家的時候會需要攜帶,因此最終選擇了迷你電腦,體積小不占空間,又方便攜帶,剛好符合我的需求。 菜單 由於這台無法裝獨顯,所以CPU的部分選擇 AMD R5 3400G(含Vega 11內
Thumbnail
2023/03/25
前情提要 由於我的筆電已經用了10年,無法再戰下去了,且有預算考量,加上使用電腦幾乎都是定點,只有偶爾回家的時候會需要攜帶,因此最終選擇了迷你電腦,體積小不占空間,又方便攜帶,剛好符合我的需求。 菜單 由於這台無法裝獨顯,所以CPU的部分選擇 AMD R5 3400G(含Vega 11內
Thumbnail
2023/03/10
Nuxt3中可使用useFetch來獲取數據,不須再引用axios,相當方便: 本筆記參考: https://juejin.cn/post/7104071421160063012 https://juejin.cn/post/7086472647575339045
2023/03/10
Nuxt3中可使用useFetch來獲取數據,不須再引用axios,相當方便: 本筆記參考: https://juejin.cn/post/7104071421160063012 https://juejin.cn/post/7086472647575339045
看更多
你可能也想看
Thumbnail
最近因為想要花些時間做完一個完整的SideProject,以前總是懂得怎麼使用,拼拼湊湊完成一個塞趴卷就交卷了,但都沒時間去真正理解這些原理的應用,而Laravel 框架本身支持的登入登出的工具,就有好多種。
Thumbnail
最近因為想要花些時間做完一個完整的SideProject,以前總是懂得怎麼使用,拼拼湊湊完成一個塞趴卷就交卷了,但都沒時間去真正理解這些原理的應用,而Laravel 框架本身支持的登入登出的工具,就有好多種。
Thumbnail
HTTPS全名是超文本傳輸安全協定,是瀏覽器與Web伺服器間的資料傳遞是以加密的方式進行通訊,而且資料隱私比http好。如果需要從外網連線到自己自己架設Nextcloud那就要改成https比較好,避免資料沒加密就傳送出去。 另外一點是如果iphone手機系統是IOS 15.6版的要連線到nextc
Thumbnail
HTTPS全名是超文本傳輸安全協定,是瀏覽器與Web伺服器間的資料傳遞是以加密的方式進行通訊,而且資料隱私比http好。如果需要從外網連線到自己自己架設Nextcloud那就要改成https比較好,避免資料沒加密就傳送出去。 另外一點是如果iphone手機系統是IOS 15.6版的要連線到nextc
Thumbnail
開發工具與環境設置 安裝所需要工具 啟動 ganache-cli來啟動乙太坊測試環境 建立智能合約 HelloWorld.sol: 編譯 編譯成功的話,在build/contracts/目錄下會多出HelloWorld.json這個檔案 部署 2\_deploy\_contracts.js: 測試
Thumbnail
開發工具與環境設置 安裝所需要工具 啟動 ganache-cli來啟動乙太坊測試環境 建立智能合約 HelloWorld.sol: 編譯 編譯成功的話,在build/contracts/目錄下會多出HelloWorld.json這個檔案 部署 2\_deploy\_contracts.js: 測試
Thumbnail
這是一場修復文化與重建精神的儀式,觀眾不需要完全看懂《遊林驚夢:巧遇Hagay》,但你能感受心與土地團聚的渴望,也不急著在此處釐清或定義什麼,但你的在場感受,就是一條線索,關於如何找著自己的路徑、自己的聲音。
Thumbnail
這是一場修復文化與重建精神的儀式,觀眾不需要完全看懂《遊林驚夢:巧遇Hagay》,但你能感受心與土地團聚的渴望,也不急著在此處釐清或定義什麼,但你的在場感受,就是一條線索,關於如何找著自己的路徑、自己的聲音。
Thumbnail
哈囉!在今天的文章中,我們將深入探討如何在 Gin 應用中實現 JWT 驗證。這種技術允許我們安全地驗證和授權用戶,並確保我們的 API 或 Web 應用的資源僅被許可的用戶訪問。
Thumbnail
哈囉!在今天的文章中,我們將深入探討如何在 Gin 應用中實現 JWT 驗證。這種技術允許我們安全地驗證和授權用戶,並確保我們的 API 或 Web 應用的資源僅被許可的用戶訪問。
Thumbnail
session & token 驗證機制早期是用 session,server 這裡會發一個 session 給 client,並在資料庫記錄這個 session 屬於誰,而且每個裝置都會記一組 session,這會造成 server 這邊需要記錄大量的資料。 後來發展出 token,client
Thumbnail
session & token 驗證機制早期是用 session,server 這裡會發一個 session 給 client,並在資料庫記錄這個 session 屬於誰,而且每個裝置都會記一組 session,這會造成 server 這邊需要記錄大量的資料。 後來發展出 token,client
Thumbnail
《轉轉生》(Re:INCARNATION)為奈及利亞編舞家庫德斯.奧尼奎庫與 Q 舞團創作的當代舞蹈作品,結合拉各斯街頭節奏、Afrobeat/Afrobeats、以及約魯巴宇宙觀的非線性時間,建構出關於輪迴的「誕生—死亡—重生」儀式結構。本文將從約魯巴哲學概念出發,解析其去殖民的身體政治。
Thumbnail
《轉轉生》(Re:INCARNATION)為奈及利亞編舞家庫德斯.奧尼奎庫與 Q 舞團創作的當代舞蹈作品,結合拉各斯街頭節奏、Afrobeat/Afrobeats、以及約魯巴宇宙觀的非線性時間,建構出關於輪迴的「誕生—死亡—重生」儀式結構。本文將從約魯巴哲學概念出發,解析其去殖民的身體政治。
Thumbnail
本筆記遵循官方文件教學,經過一些小修改,經測試可以跑在Laravel Framework version: 8.13.0,將筆記記錄下來。 ......
Thumbnail
本筆記遵循官方文件教學,經過一些小修改,經測試可以跑在Laravel Framework version: 8.13.0,將筆記記錄下來。 ......
Thumbnail
首先先簡單說明 Laravel 中的 Middleware (中介層),Middleware 是一種用於處理 HTTP 請求的機制,它允許你在請求到達應用程序的路由之前或之後執行一些代碼。Middleware 通常用於執行諸如驗證、授權、日誌記錄、修改請求/響應等操作。
Thumbnail
首先先簡單說明 Laravel 中的 Middleware (中介層),Middleware 是一種用於處理 HTTP 請求的機制,它允許你在請求到達應用程序的路由之前或之後執行一些代碼。Middleware 通常用於執行諸如驗證、授權、日誌記錄、修改請求/響應等操作。
Thumbnail
背景:從冷門配角到市場主線,算力與電力被重新定價   小P從2008進入股市,每一個時期的投資亮點都不同,記得2009蘋果手機剛上市,當時蘋果只要在媒體上提到哪一間供應鏈,隔天股價就有驚人的表現,當時光學鏡頭非常熱門,因為手機第一次搭上鏡頭可以拍照,也造就傳統相機廠的殞落,如今手機已經全面普及,題
Thumbnail
背景:從冷門配角到市場主線,算力與電力被重新定價   小P從2008進入股市,每一個時期的投資亮點都不同,記得2009蘋果手機剛上市,當時蘋果只要在媒體上提到哪一間供應鏈,隔天股價就有驚人的表現,當時光學鏡頭非常熱門,因為手機第一次搭上鏡頭可以拍照,也造就傳統相機廠的殞落,如今手機已經全面普及,題
Thumbnail
本文分析導演巴里・柯斯基(Barrie Kosky)如何運用極簡的舞臺配置,將布萊希特(Bertolt Brecht)的「疏離效果」轉化為視覺奇觀與黑色幽默,探討《三便士歌劇》在當代劇場中的新詮釋,並藉由舞臺、燈光、服裝、音樂等多方面,分析該作如何在保留批判核心的同時,觸及觀眾的觀看位置與人性幽微。
Thumbnail
本文分析導演巴里・柯斯基(Barrie Kosky)如何運用極簡的舞臺配置,將布萊希特(Bertolt Brecht)的「疏離效果」轉化為視覺奇觀與黑色幽默,探討《三便士歌劇》在當代劇場中的新詮釋,並藉由舞臺、燈光、服裝、音樂等多方面,分析該作如何在保留批判核心的同時,觸及觀眾的觀看位置與人性幽微。
Thumbnail
上一篇筆記講到了瀏覽器與伺服器之間,經過身分驗證後,就會改以 Token 這個令牌作為通行證,不需要再反覆驗證,那麼這篇紀錄的就是目前最常使用的 JWT (JSON Web Token) 啦! 可以搭配 JWT 的網站來玩看看 JWT(JSON Web Token) 顧名思義就是以 JSON
Thumbnail
上一篇筆記講到了瀏覽器與伺服器之間,經過身分驗證後,就會改以 Token 這個令牌作為通行證,不需要再反覆驗證,那麼這篇紀錄的就是目前最常使用的 JWT (JSON Web Token) 啦! 可以搭配 JWT 的網站來玩看看 JWT(JSON Web Token) 顧名思義就是以 JSON
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News