欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

ThinkPHP5實現JWT?Token認證的過程(親測可用)

 更新時間:2022年10月26日 09:32:05   作者:Your_is_my_God  
這篇文章主要介紹了ThinkPHP5實現JWT?Token認證,首先composer先掛載阿里云鏡像,安裝JWT擴展,本文給大家講解的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下

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位置

<?php
use 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')//配置發(fā)行人
			->canonlyBeUsedBy( audience: " user')//配置接收人
			->identifiedBy( id: ' quanzhankaifa',replicateAsHeader: true)//標題id->issuedAt($time)//發(fā)出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、自行找控制器進行測試

<?php
namespace 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

//驗證token
static 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進行開發(fā)。

(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封裝到構造中進行驗證【實例化類的時候自動調用構造,構造會在每一個要執(zhí)行的方法前自動執(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;
	}
    }
}

到此這篇關于ThinkPHP5實現JWT Token認證的文章就介紹到這了,更多相關ThinkPHP5 JWT Token認證內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

最新評論