實例詳解thinkphp6使用jwt認證
這篇文章為大家帶來了關於thinkphp的相關知識,其中主要介紹了使用jwt認證的問題,下面一起來看一下,希望對大家有幫助。
推薦學習:《PHP影片教學》
thinkphp6 使用jwt
- 客戶端使用使用者名稱和密碼請求登入
- 服務端收到請求,驗證使用者名稱和密碼
- #驗證成功後,服務端會簽發一個token,再把這個token回傳給客戶端
- 客戶端收到token後可以把它儲存起來,例如放到cookie中
- 客戶端每次向服務端請求資源時需要攜帶服務端簽發的token,可以在cookie或header中攜帶
- 服務端收到請求,然後去驗證客戶端請求裡面帶著的token,如果驗證成功,就向客戶端返回請求資料
composer require firebase/php-jwt
登入後複製
安裝之後在vender 目錄下的firebase 資料夾下
composer require firebase/php-jwt
專案app 目錄下的common.php全域檔案使用的,做成了公共方法,由於我是多應用的,所以就寫在了api下面的common.php,大家可以根據自己需求適當調整
先介紹JWT ,然後寫兩個方法,產生驗簽和驗證token。 <?phpuse \Firebase\JWT\JWT;use Firebase\JWT\Key;// 应用公共文件/**
* 生成验签
* @param $uid 用户id
* @return mixed
*/function signToken($uid){
$key='abcdefg'; //自定义的一个随机字串用户于加密中常用的 盐 salt
$token=array(
"iss"=>$key, //签发者 可以为空
"aud"=>'', //面象的用户,可以为空
"iat"=>time(), //签发时间
"nbf"=>time(), //在什么时候jwt开始生效
"exp"=> time()+30, //token 过期时间
"data"=>[ //记录的uid的信息
'uid'=>$uid,
]
);
$jwt = JWT::encode($token, $key, "HS256"); //生成了 token
return $jwt;}/**
* 验证token
* @param $token
* @return array|int[]
*/function checkToken($token){
$key='abcdefg'; //自定义的一个随机字串用户于加密中常用的 盐 salt
$res['status'] = false;
try {
JWT::$leeway = 60;//当前时间减去60,把时间留点余地
$decoded = JWT::decode($token, new Key($key, 'HS256')); //HS256方式,这里要和签发的时候对应
$arr = (array)$decoded;
$res['status'] = 200;
$res['data'] =(array)$arr['data'];
return $res;
} catch(\Firebase\JWT\SignatureInvalidException $e) { //签名不正确
$res['info'] = "签名不正确";
return $res;
}catch(\Firebase\JWT\BeforeValidException $e) { // 签名在某个时间点之后才能用
$res['info'] = "token失效";
return $res;
}catch(\Firebase\JWT\ExpiredException $e) { // token过期
$res['info'] = "token过期";
return $res;
}catch(Exception $e) { //其他错误
$res['info'] = "未知错误";
return $res;
}}
登入後複製
<?phpuse \Firebase\JWT\JWT;use Firebase\JWT\Key;// 应用公共文件/** * 生成验签 * @param $uid 用户id * @return mixed */function signToken($uid){ $key='abcdefg'; //自定义的一个随机字串用户于加密中常用的 盐 salt $token=array( "iss"=>$key, //签发者 可以为空 "aud"=>'', //面象的用户,可以为空 "iat"=>time(), //签发时间 "nbf"=>time(), //在什么时候jwt开始生效 "exp"=> time()+30, //token 过期时间 "data"=>[ //记录的uid的信息 'uid'=>$uid, ] ); $jwt = JWT::encode($token, $key, "HS256"); //生成了 token return $jwt;}/** * 验证token * @param $token * @return array|int[] */function checkToken($token){ $key='abcdefg'; //自定义的一个随机字串用户于加密中常用的 盐 salt $res['status'] = false; try { JWT::$leeway = 60;//当前时间减去60,把时间留点余地 $decoded = JWT::decode($token, new Key($key, 'HS256')); //HS256方式,这里要和签发的时候对应 $arr = (array)$decoded; $res['status'] = 200; $res['data'] =(array)$arr['data']; return $res; } catch(\Firebase\JWT\SignatureInvalidException $e) { //签名不正确 $res['info'] = "签名不正确"; return $res; }catch(\Firebase\JWT\BeforeValidException $e) { // 签名在某个时间点之后才能用 $res['info'] = "token失效"; return $res; }catch(\Firebase\JWT\ExpiredException $e) { // token过期 $res['info'] = "token过期"; return $res; }catch(Exception $e) { //其他错误 $res['info'] = "未知错误"; return $res; }}
使用jwt產生token /**
* 使用jwt生成token字符串
*/
public function setJwtToken()
{
$uid = input('uid'); // 接收生成token字符串 如:123
$token = signToken($uid);
// 生成字符串: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJhYmNkZWZnIiwiYXVkIjoiIiwiaWF0IjoxNjQxNDUwMTU0LCJuYmYiOjE2NDE0NTAxNTcsImV4cCI6MTY0MTQ1NzM1NCwiZGF0YSI6eyJ1aWQiOiIxMjMifX0.I_GAkMsOhtEpIPkizCuQA-b9H6ovSovWx0AwAYI-b0s
echo $token;die;
}
/**
* 使用jwt验证token字符串
*/
public function checkJwtToken()
{
$token = input('token'); // 接收生成token字符串
$result = checkToken($token);
// Array ( [status] => 200 [data] => Array ( [uid] => 123 ) )
print_r($result);die;
}
登入後複製
/** * 使用jwt生成token字符串 */ public function setJwtToken() { $uid = input('uid'); // 接收生成token字符串 如:123 $token = signToken($uid); // 生成字符串: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJhYmNkZWZnIiwiYXVkIjoiIiwiaWF0IjoxNjQxNDUwMTU0LCJuYmYiOjE2NDE0NTAxNTcsImV4cCI6MTY0MTQ1NzM1NCwiZGF0YSI6eyJ1aWQiOiIxMjMifX0.I_GAkMsOhtEpIPkizCuQA-b9H6ovSovWx0AwAYI-b0s echo $token;die; } /** * 使用jwt验证token字符串 */ public function checkJwtToken() { $token = input('token'); // 接收生成token字符串 $result = checkToken($token); // Array ( [status] => 200 [data] => Array ( [uid] => 123 ) ) print_r($result);die; }
建立user 控制器<?phpdeclare (strict_types = 1);namespace app\api\controller;use think\facade\Db;use think\Request;class User{
public function login(Request $request)
{
if ($request->isPost()){
$username = $request->param('username','','trim');
$password = $request->param('password','','trim');
//查询数据库
$user = Db::name('user')->where('username',$username)->find();
if (!$user){
return json(['status' => 'fail','msg' => '用户名不存在']);
}
if ($user['password']!==md5($password)){
return json(['status' => 'fail','msg' => '密码错误']);
}
$getToken = $this->token($user);
return json(['status' => 'success','msg' => '登陆成功','token' => $getToken]);
}
}
public function token($user)
{
$uid = $user['username']; // 接收生成token字符串 如:123
$token = signToken($uid);
dd($token);
}
/**
* 验证token
*/
public function chToken()
{
$token = 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJhYmNkZWZnIiwiYXVkIjoiIiwiaWF0IjoxNjQ4MDkwMDkyLCJuYmYiOjE2NDgwOTAwOTIsImV4cCI6MTY0ODA5MDEyMiwiZGF0YSI6eyJ1aWQiOiJcdTVmMjBcdTRlMDlcdTk4Y2UifX0.oJFpNcZ6stMymOCbD-meX0IPEIYLYNcwKxhMItF2cMw';
$result = checkToken($token);
// Array ( [status] => 200 [data] => Array ( [uid] => 123 ) )
print_r($result);die;
}}
登入後複製
使用者登入成功傳回前端token,前端將token儲存起來,在下次請求的時候頭部攜帶著這個token,後端接受token,在中間件中進行驗證
<?phpdeclare (strict_types = 1);namespace app\api\controller;use think\facade\Db;use think\Request;class User{ public function login(Request $request) { if ($request->isPost()){ $username = $request->param('username','','trim'); $password = $request->param('password','','trim'); //查询数据库 $user = Db::name('user')->where('username',$username)->find(); if (!$user){ return json(['status' => 'fail','msg' => '用户名不存在']); } if ($user['password']!==md5($password)){ return json(['status' => 'fail','msg' => '密码错误']); } $getToken = $this->token($user); return json(['status' => 'success','msg' => '登陆成功','token' => $getToken]); } } public function token($user) { $uid = $user['username']; // 接收生成token字符串 如:123 $token = signToken($uid); dd($token); } /** * 验证token */ public function chToken() { $token = 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJhYmNkZWZnIiwiYXVkIjoiIiwiaWF0IjoxNjQ4MDkwMDkyLCJuYmYiOjE2NDgwOTAwOTIsImV4cCI6MTY0ODA5MDEyMiwiZGF0YSI6eyJ1aWQiOiJcdTVmMjBcdTRlMDlcdTk4Y2UifX0.oJFpNcZ6stMymOCbD-meX0IPEIYLYNcwKxhMItF2cMw'; $result = checkToken($token); // Array ( [status] => 200 [data] => Array ( [uid] => 123 ) ) print_r($result);die; }}
創建api中間件 <?phpdeclare (strict_types = 1);namespace app\middleware;class Api{
/**
* 处理请求
*
* @param \think\Request $request
* @param \Closure $next
* @return Response
*/
public function handle($request, \Closure $next)
{
//toke 合法性验证
$header = $request->header();
//判读请求头里有没有token
if(!isset($header['token'])){
return json(['code'=>440,'msg'=>'request must with token']);
}
$token = $header['token'];
try {
// token 合法
$token = checkToken($token);
}catch (\Exception $e){
return json(['code'=>440,'msg'=>'invalid token']);
}
return $next($request);
}}
登入後複製
最後,關於如何處理token過期的問題,有兩種解決辦法,第一種就是,將token的時間設定長一些,這樣token就不會過期,但是這樣就有一個弊端,一旦客戶端拿到了這個token就等於有了金鑰,主動權也就掌握在了使用者的手上。所以不推薦這種方案。第二種就是,後端處理,當token過期的時候重新獲取token,將新的token傳給前端,前端在將新的token存儲起來,替換掉原來的token,下一次請求的時候就攜帶著新的token請求。 我是程式設計師峰峰,愛學習,愛折騰的程式設計師。 推薦學習:《<?phpdeclare (strict_types = 1);namespace app\middleware;class Api{ /** * 处理请求 * * @param \think\Request $request * @param \Closure $next * @return Response */ public function handle($request, \Closure $next) { //toke 合法性验证 $header = $request->header(); //判读请求头里有没有token if(!isset($header['token'])){ return json(['code'=>440,'msg'=>'request must with token']); } $token = $header['token']; try { // token 合法 $token = checkToken($token); }catch (\Exception $e){ return json(['code'=>440,'msg'=>'invalid token']); } return $next($request); }}
PHP影片教學》
以上是實例詳解thinkphp6使用jwt認證的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

執行 ThinkPHP 專案需要:安裝 Composer;使用 Composer 建立專案;進入專案目錄,執行 php bin/console serve;造訪 http://localhost:8000 查看歡迎頁面。

ThinkPHP 擁有多個版本,針對不同 PHP 版本而設計。主要版本包括 3.2、5.0、5.1 和 6.0,而次要版本用於修復 bug 和提供新功能。目前最新穩定版本為 ThinkPHP 6.0.16。在選擇版本時,需考慮 PHP 版本、功能需求和社群支援。建議使用最新穩定版本以獲得最佳性能和支援。

ThinkPHP Framework 的本機運作步驟:下載並解壓縮 ThinkPHP Framework 到本機目錄。建立虛擬主機(可選),指向 ThinkPHP 根目錄。配置資料庫連線參數。啟動 Web 伺服器。初始化 ThinkPHP 應用程式。存取 ThinkPHP 應用程式 URL 運行。

Laravel 和 ThinkPHP 框架的效能比較:ThinkPHP 效能通常優於 Laravel,專注於最佳化和快取。 Laravel 性能良好,但對於複雜應用程序,ThinkPHP 可能更適合。

ThinkPHP 安裝步驟:準備 PHP、Composer、MySQL 環境。使用 Composer 建立專案。安裝 ThinkPHP 框架及相依性。配置資料庫連線。產生應用程式碼。啟動應用程式並造訪 http://localhost:8000。

《開發建議:如何利用ThinkPHP框架實現非同步任務》隨著網路技術的快速發展,Web應用程式對於處理大量並發請求和複雜業務邏輯的需求也越來越高。為了提高系統的效能和使用者體驗,開發人員常常會考慮利用非同步任務來執行一些耗時操作,例如發送郵件、處理文件上傳、產生報表等。在PHP領域,ThinkPHP框架作為一個流行的開發框架,提供了一些便捷的方式來實現非同步任務。

ThinkPHP 是一款高效能的 PHP 框架,具備快取機制、程式碼最佳化、平行處理和資料庫最佳化等優勢。官方性能測試顯示,它每秒可處理超過 10,000 個請求,實際應用中被廣泛用於京東商城、攜程網等大型網站和企業系統。

開發建議:如何利用ThinkPHP框架進行API開發隨著網際網路的不斷發展,API(ApplicationProgrammingInterface)的重要性也日益凸顯。 API是不同應用程式之間進行通訊的橋樑,它可以實現資料共享、功能呼叫等操作,為開發者提供了相對簡單且快速的開發方式。而ThinkPHP框架作為一款優秀的PHP開發框架,具有高效能、可擴展且易用
