新聞中心
本篇內(nèi)容主要講解“thinkphp6中怎么使用jwt認(rèn)證”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實(shí)用性強(qiáng)。下面就讓小編來帶大家學(xué)習(xí)“thinkphp6中怎么使用jwt認(rèn)證”吧!

創(chuàng)新互聯(lián)為企業(yè)級(jí)客戶提高一站式互聯(lián)網(wǎng)+設(shè)計(jì)服務(wù),主要包括網(wǎng)站設(shè)計(jì)、成都網(wǎng)站制作、App定制開發(fā)、微信小程序定制開發(fā)、宣傳片制作、LOGO設(shè)計(jì)等,幫助客戶快速提升營銷能力和企業(yè)形象,創(chuàng)新互聯(lián)各部門都有經(jīng)驗(yàn)豐富的經(jīng)驗(yàn),可以確保每一個(gè)作品的質(zhì)量和創(chuàng)作周期,同時(shí)每年都有很多新員工加入,為我們帶來大量新的創(chuàng)意。
thinkphp6 使用jwt
客戶端使用用戶名和密碼請求登錄
服務(wù)端收到請求,驗(yàn)證用戶名和密碼
驗(yàn)證成功后,服務(wù)端會(huì)簽發(fā)一個(gè)token,再把這個(gè)token返回給客戶端
客戶端收到token后可以把它存儲(chǔ)起來,比如放到cookie中
客戶端每次向服務(wù)端請求資源時(shí)需要攜帶服務(wù)端簽發(fā)的token,可以在cookie或者h(yuǎn)eader中攜帶
服務(wù)端收到請求,然后去驗(yàn)證客戶端請求里面帶著的token,如果驗(yàn)證成功,就向客戶端返回請求數(shù)據(jù)
安裝 jwt 擴(kuò)展
composer require firebase/php-jwt
安裝之后在 vender 目錄下的 firebase 文件夾下
調(diào)用 JWT里面的 encode 和 decode方法進(jìn)行生成token和驗(yàn)證token
項(xiàng)目app 目錄下的 common.php全局文件使用的 ,做成了公共方法,由于我是多應(yīng)用的,所以就寫在了api下面的common.php,大家可以根據(jù)自己需求適當(dāng)調(diào)整
首先 引入 JWT ,然后寫兩個(gè)方法,生成驗(yàn)簽和驗(yàn)證token。
$key, //簽發(fā)者 可以為空
"aud"=>'', //面象的用戶,可以為空
"iat"=>time(), //簽發(fā)時(shí)間
"nbf"=>time(), //在什么時(shí)候jwt開始生效
"exp"=> time()+30, //token 過期時(shí)間
"data"=>[ //記錄的uid的信息
'uid'=>$uid,
]
);
$jwt = JWT::encode($token, $key, "HS256"); //生成了 token
return $jwt;}/**
* 驗(yàn)證token
* @param $token
* @return array|int[]
*/function checkToken($token){
$key='abcdefg'; //自定義的一個(gè)隨機(jī)字串用戶于加密中常用的 鹽 salt
$res['status'] = false;
try {
JWT::$leeway = 60;//當(dāng)前時(shí)間減去60,把時(shí)間留點(diǎn)余地
$decoded = JWT::decode($token, new Key($key, 'HS256')); //HS256方式,這里要和簽發(fā)的時(shí)候?qū)?yīng)
$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) { // 簽名在某個(gè)時(shí)間點(diǎn)之后才能用
$res['info'] = "token失效";
return $res;
}catch(\Firebase\JWT\ExpiredException $e) { // token過期
$res['info'] = "token過期";
return $res;
}catch(Exception $e) { //其他錯(cuò)誤
$res['info'] = "未知錯(cuò)誤";
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驗(yàn)證token字符串
*/
public function checkJwtToken()
{
$token = input('token'); // 接收生成token字符串
$result = checkToken($token);
// Array ( [status] => 200 [data] => Array ( [uid] => 123 ) )
print_r($result);die;
}創(chuàng)建 user 控制器
isPost()){
$username = $request->param('username','','trim');
$password = $request->param('password','','trim');
//查詢數(shù)據(jù)庫
$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' => '密碼錯(cuò)誤']);
}
$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);
}
/**
* 驗(yàn)證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存儲(chǔ)起來,在下次請求的時(shí)候頭部攜帶著這個(gè)token,后端接受token,在中間件中進(jìn)行驗(yàn)證
創(chuàng)建api中間件
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);
}}到此,相信大家對(duì)“thinkphp6中怎么使用jwt認(rèn)證”有了更深的了解,不妨來實(shí)際操作一番吧!這里是創(chuàng)新互聯(lián)網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!
分享名稱:thinkphp6中怎么使用jwt認(rèn)證
文章URL:http://biofuelwatch.net/article/pegcdi.html


咨詢
建站咨詢
