ThinkPHP5實(shí)現(xiàn)JWT?Token認(rèn)證的過程(親測可用)
1、composer先掛載阿里云鏡像
composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/
2、安裝JWT擴(kuò)展
composer require lcobucci/jwt 3.3
3、在vendor目錄中打開readme.md文件

4、在extend目錄中,自定義類進(jìn)行JWT操作生成token

5、操作Token.php實(shí)現(xiàn)生成token的方法,詳細(xì)在readme.md中的Hmac位置
<?php
use Lcobucci\JWT\Builder;
use Lcobucci\JWT\signer\Hmac\Sha256;
class Token{
//自定義一個(gè)生成token的方法
static public function createToken($uid = null){
$signer = new Sha256(;//加密算法
$time = time(;//當(dāng)前的時(shí)間戳
$token = (new Builder())
->issuedBy( issuer: "fanxinze')//配置發(fā)行人
->canonlyBeUsedBy( audience: " user')//配置接收人
->identifiedBy( id: ' quanzhankaifa',replicateAsHeader: true)//標(biāo)題id->issuedAt($time)//發(fā)出token令牌的時(shí)間
->canonlyBeUsedAfter( notBefore: $time + 60)//生效時(shí)間->expiresAt( expiration: $time + 3600)//過期時(shí)間
->with( name: " uid' , $uid)//用戶id
->sign($signer, key: ' 1902a" )//簽名內(nèi)容->getToken(;//獲取token
return (string)$token;
}
}注意:生效時(shí)間+60表示1分鐘后生效,可以去掉加法運(yùn)算,表示即時(shí)生效

6、自行找控制器進(jìn)行測試
<?php
namespace app\index\controller;
use think\Controller;
use Token;
class Index extends Controller
{
public function index()
{
$token = Token : : createToken();
return $token;
}
}
7、最終會(huì)得到結(jié)果類似如下所示:
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiIsImp0aSI6IjRmMWcyM2ExMmFhIn0.eyJpc3MiOiJmYW54aW56ZSIsImF1ZCI6InVzZXIiLCJqdGkiOiI0ZjFnMjNhMTJhYSIsImlhdCI6MTYxOTY2NjUwNywibmJmIjoxNjE5NjY2NTY3LCJleHAiOjE2MTk2NzAxMDcsInVpZCI6MTJ9.N6CkSWaNdTVk2ust9QzRa1wpY-ZCQTwp5nYPLYa_K-k
8、封裝驗(yàn)證Token的方法,如果失敗返回false,如果成功返回用戶id
//驗(yàn)證token
static public function verifyToken($token=null){
//檢測是否接收到了token
if(empty($token)){
return 0;
}
//代碼到50行,就表示取到token了,那么轉(zhuǎn)化成jwt認(rèn)識(shí)的token
$token = (new Parser())->parse((string) $token);
//驗(yàn)證基本設(shè)置
$data = new ValidationData();
$data->setIssuer( issuer: "teacher ' );
$data->setAudience( audience: 'student ' );$data->setId( id: " quanzhan ' );
if(!$token->validate($data)){
return 0;
}
//驗(yàn)證簽名
$signer = new sha256();
if(!$token->verify($signer, key: ' 1902a' )){
return 0;
}
//驗(yàn)證通過,返回用戶id
return $token->getclaim( name:'uid');
}

9、案例:Token在實(shí)際代碼中的應(yīng)用
注意:這里為了簡單的做測試,使用的是DB操作,但是在實(shí)際代碼中不建議使用DB,必須使用MVC進(jìn)行開發(fā)。
(1)、登錄的時(shí)候生成token
//登錄
public function login(){
$data = input();
array_shift( &array: $data);if(empty($data[ ' username ' ])){
return json([ 'code'=>1, ' msg'=>'用戶名不能為空' , ' result'=>null]);
}
if(empty($data[ ' password' ])){
return json([ 'code '=>2, ' msg'=>'密碼不能為空', ' result'=>null]);
}
$data[ " password ' ] = md5($data[ ' password ' ]);
$info = Db ::table( table: 'tpshop_manager ')->where($data)->find();
if(!$info){
return json( [ 'code '=>3 , ' msg'=>'賬號密碼有誤', ' result'=>null]);
}
//登錄成功
//生成token
$token = Token : : createToken($info[ 'id' ]);
$info[ 'token' ] = $token;
return json([ ' code '=>0, ' msg'=>'登錄成功", ' result'=>$info]);
}
(2)、登錄后可以拿到token,然后請求其他接口的時(shí)候就驗(yàn)證token是否正確,如果不正確,提示無效的token
public function index()
{
$token = input(key: 'token') ;
$res = Token::verifyToken($token);
if($res==0){
return json([ 'code'=>1, 'msg '=>'無效的Token " , "result'=>null]);
}
$data = Db::table(table: "'tpshop_manager" )->paginate(listRows: 7);
return json([ " code '=>0, ' msg'=>'成功", "result'=>$data]);
}
(3)、由于登錄后的每一個(gè)方法可能都需要驗(yàn)證token,所以我們把token封裝到構(gòu)造中進(jìn)行驗(yàn)證【實(shí)例化類的時(shí)候自動(dòng)調(diào)用構(gòu)造,構(gòu)造會(huì)在每一個(gè)要執(zhí)行的方法前自動(dòng)執(zhí)行】
class Base extends controller
{
public function _construct(Request $request = null)
{
$token = $request->param( name: "token " );$res = Token : :verifyToken($token) ;
if($res==0){
$arr = [ ' code'=>1, 'msg'=>'無效的Token " , ' result'=>null];
echo json_encode($arr);
die;
}
}
}

到此這篇關(guān)于ThinkPHP5實(shí)現(xiàn)JWT Token認(rèn)證的文章就介紹到這了,更多相關(guān)ThinkPHP5 JWT Token認(rèn)證內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
ThinkPHP5.0多個(gè)文件上傳后找不到臨時(shí)文件的修改方法
這篇文章主要介紹了ThinkPHP5.0多個(gè)文件上傳后找不到臨時(shí)文件的修改方法,需要的朋友可以參考下2018-07-07
php文件擴(kuò)展名判斷及獲取文件擴(kuò)展名的N種方法
本篇文章主要通過代碼給大家介紹php文件擴(kuò)展名判斷以及獲取文件擴(kuò)展名的N種方法,需要的朋友跟著腳本之家小編一起學(xué)習(xí)學(xué)習(xí)吧2015-09-09
PHP array_reduce()函數(shù)的應(yīng)用解析
這篇文章主要介紹了PHP array_reduce()的應(yīng)用,本文通過代碼舉例給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2018-10-10
發(fā)布一個(gè)用PHP fsockopen寫的HTTP下載的類
發(fā)布一個(gè)用PHP fsockopen寫的HTTP下載的類...2007-02-02
在swoole中制作一款仿制laravel的框架的實(shí)例代碼
這篇文章主要介紹了在swoole中制作一款仿制laravel的框架,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-03-03
PHP實(shí)現(xiàn)簡易用戶登錄系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了PHP實(shí)現(xiàn)簡易用戶登錄系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-07-07
ThinkPHP5分頁paginate代碼實(shí)例解析
這篇文章主要介紹了ThinkPHP5分頁paginate代碼實(shí)例解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-11-11
php版微信公眾平臺(tái)實(shí)現(xiàn)預(yù)約提交后發(fā)送email的方法
這篇文章主要介紹了php版微信公眾平臺(tái)實(shí)現(xiàn)預(yù)約提交后發(fā)送email的方法,結(jié)合實(shí)例形式分析了php微信公眾平臺(tái)郵件發(fā)送的相關(guān)操作技巧,需要的朋友可以參考下2016-09-09

