ThinkPHP5實現JWT Token認證的過程(親測可用)
1、composer先掛載阿里云鏡像
composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/
2、安裝JWT擴展
composer require lcobucci/jwt 3.3
3、在vendor目錄中打開readme.md文件
4、在extend目錄中,自定義類進行JWT操作生成token
5、操作Token.php實現生成token的方法,詳細在readme.md中的Hmac位置
<?phpuse Lcobucci\JWT\Builder;use Lcobucci\JWT\signer\Hmac\Sha256;class Token{ //自定義一個生成token的方法 static public function createToken($uid = null){ $signer = new Sha256(;//加密算法 $time = time(;//當前的時間戳 $token = (new Builder()) ->issuedBy( issuer: "fanxinze")//配置發行人 ->canonlyBeUsedBy( audience: " user")//配置接收人 ->identifiedBy( id: " quanzhankaifa",replicateAsHeader: true)//標題id->issuedAt($time)//發出token令牌的時間 ->canonlyBeUsedAfter( notBefore: $time + 60)//生效時間->expiresAt( expiration: $time + 3600)//過期時間 ->with( name: " uid" , $uid)//用戶id ->sign($signer, key: " 1902a" )//簽名內容->getToken(;//獲取token return (string)$token; }}
注意:生效時間+60表示1分鐘后生效,可以去掉加法運算,表示即時生效
6、自行找控制器進行測試
<?phpnamespace app\index\controller;use think\Controller;use Token;class Index extends Controller{ public function index() { $token = Token : : createToken(); return $token; }}
7、最終會得到結果類似如下所示:
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiIsImp0aSI6IjRmMWcyM2ExMmFhIn0.eyJpc3MiOiJmYW54aW56ZSIsImF1ZCI6InVzZXIiLCJqdGkiOiI0ZjFnMjNhMTJhYSIsImlhdCI6MTYxOTY2NjUwNywibmJmIjoxNjE5NjY2NTY3LCJleHAiOjE2MTk2NzAxMDcsInVpZCI6MTJ9.N6CkSWaNdTVk2ust9QzRa1wpY-ZCQTwp5nYPLYa_K-k
8、封裝驗證Token的方法,如果失敗返回false,如果成功返回用戶id
//驗證tokenstatic public function verifyToken($token=null){ //檢測是否接收到了token if(empty($token)){ return 0; } //代碼到50行,就表示取到token了,那么轉化成jwt認識的token $token = (new Parser())->parse((string) $token); //驗證基本設置 $data = new ValidationData(); $data->setIssuer( issuer: "teacher " ); $data->setAudience( audience: "student " );$data->setId( id: " quanzhan " ); if(!$token->validate($data)){ return 0; } //驗證簽名 $signer = new sha256(); if(!$token->verify($signer, key: " 1902a" )){ return 0; } //驗證通過,返回用戶id return $token->getclaim( name:"uid");}
9、案例:Token在實際代碼中的應用
注意:這里為了簡單的做測試,使用的是DB操作,但是在實際代碼中不建議使用DB,必須使用MVC進行開發。
(1)、登錄的時候生成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,然后請求其他接口的時候就驗證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)、由于登錄后的每一個方法可能都需要驗證token,所以我們把token封裝到構造中進行驗證【實例化類的時候自動調用構造,構造會在每一個要執行的方法前自動執行】
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; } }}
到此這篇關于ThinkPHP5實現JWT Token認證的文章就介紹到這了,更多相關ThinkPHP5 JWT Token認證內容請搜索以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持!