在Web開發中,接口認證是很重要的一個環節。而JWT(Json Web Token)是目前比較常用的一種Token認證方式,因為它是無狀態,所以在分佈式的環境下很適合。ThinkPHP JWT是一個基於ThinkPHP5的JWT擴展,它可以幫助我們快速實現JWT的功能。
一、安裝和配置
首先,我們需要安裝ThinkPHP JWT擴展,可以通過Composer進行安裝:
composer require smartisan/think-jwt
然後,在config目錄下創建jwt.php文件,用於配置:
return [
'key' => 'thinkphpjwt', // 用於簽名的Key
'iss' => 'thinkphp', // 簽發者
'aud' => 'client', // 面向的用戶
'exp' => 7200, // 過期時間,單位秒
'nbf' => 300, // 在此時間之前不可用,單位秒
'sub' => '', // 主題
];
其中,’key’是用於簽名的Key,建議設置為隨機字符串,’iss’是簽發者,’aud’是面向的用戶,’exp’是過期時間,’nbf’是在此時間之前不可用,’sub’是主題。
接下來,在config目錄下的middleware.php文件中添加中間件:
return [
'jwtAuth' => \smartisan\jwt\middleware\JWTAuth::class,
];
這樣,我們就將JWT認證的中間件加入到了中間件列表中,可以在需要認證的接口中使用該中間件進行認證。
二、生成和解析Token
採用JWT認證的過程中,需要生成Token,然後發送給客戶端,客戶端在請求接口時需要帶上該Token進行認證。而服務端在接收到請求之後需要解析Token,然後進行認證。下面我們分別來看一下如何生成Token和如何解析Token。
1、生成Token
首先,我們需要在需要認證的控制器中生成Token:
use smartisan\jwt\JWT;
class UserController extends Controller
{
public function login()
{
// 驗證用戶名和密碼
...
// 生成Token
$key = config('jwt.key'); // 獲取key
$jwt = JWT::getInstance();
$payload = [
'uid' => $user['uid'],
'username' => $user['username'],
'exp' => time() + config('jwt.exp'),
];
$token = $jwt->getToken($payload, $key);
// 返回Token
return json([
'code' => 200,
'msg' => '登錄成功',
'token' => $token,
]);
}
}
在上面的代碼中,我們將uid和username放入了payload中,並設置Token的過期時間。然後通過JWT::getInstance()獲取JWT實例,調用getToken()方法生成Token,最後將Token返回給客戶端。
2、解析Token
在接收到客戶端請求時,我們需要先解析Token,然後進行認證:
use smartisan\jwt\JWT;
class UserController extends Controller
{
public function getInfo()
{
// 解析Token
$token = request()->header('Authorization');
$key = config('jwt.key'); // 獲取key
$jwt = JWT::getInstance();
try {
$payload = $jwt->verifyToken($token, $key);
} catch (\Exception $e) {
return json([
'code' => 401,
'msg' => '未登錄或登錄已過期',
]);
}
// 認證通過,返回用戶信息
...
}
}
在上面的代碼中,我們通過request()->header(‘Authorization’)獲取請求頭中的Token,然後通過JWT::getInstance()獲取JWT實例,調用verifyToken()方法解析Token,如果Token解析失敗,則返回401狀態碼,認證失敗;否則,認證通過,返回用戶信息。
三、在路由中使用中間件
在ThinkPHP中,我們可以在路由中使用中間件,方便進行接口認證。在路由文件中,可以使用middleware()方法來添加中間件:
use think\Route;
Route::get('user/info', 'user/getInfo')->middleware('jwtAuth');
在上面的代碼中,我們將’user/getInfo’這個接口使用jwtAuth中間件進行認證。
四、使用JWT認證的優點
JWT認證有以下幾個優點:
1、無狀態
由於採用了JWT認證方式,因此我們不需要再維護Session或者Token,也不需要在服務端存儲Token。這樣,就可以避免諸如Session劫持等安全問題。
2、輕量級
JWT認證的Token可以很輕鬆地在不同的服務之間傳遞,因為它是一種基於Base64編碼的Token。這樣,對於服務端的負載也比較小。
3、可擴展性強
JWT認證是一種開放標準,因此可以很方便地擴展使用,也可以嵌入到其它的認證方式中。
4、易於實現
使用ThinkPHP JWT可以很方便地實現JWT認證,也可以很好地與ThinkPHP框架結合使用。
五、總結
本文主要對使用ThinkPHP JWT進行接口認證進行了詳細的介紹,包括安裝和配置、生成和解析Token、在路由中使用中間件和JWT認證的優點。希望對大家有所幫助。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/150835.html