JWT(JSON Web Token)是一種用于在網(wǎng)絡(luò)應(yīng)用間傳遞信息的安全方式,其通常用于身份驗(yàn)證和授權(quán)。相比于傳統(tǒng)的Session和Cookie方式,JWT更加輕便,并且可以跨域傳輸,適用于分布式云計(jì)算等各種場景。
在PHP中,我們可以使用Zend框架來輔助我們生成和驗(yàn)證JWT。
首先,我們需要在我們的應(yīng)用程序中安裝Zend的相關(guān)依賴:composer require zendframework/zend-expressive-jwtauthentication
然后,我們需要在我們應(yīng)用程序中添加相關(guān)的中間件,以便在每次HTTP請求時(shí)驗(yàn)證JWT的有效性。例如:
$app->pipe(\Zend\Expressive\Authentication\AuthenticationMiddleware::class); $app->pipe(JwtAuthentication::class);以上代碼中,我們使用AuthenticationMiddleware中間件來驗(yàn)證用戶身份,JwtAuthentication中間件則用于驗(yàn)證JWT的有效性,并且從JWT獲取我們需要的數(shù)據(jù)。 若要從頭開始創(chuàng)建JWT,則可以按照以下步驟進(jìn)行: 1. 創(chuàng)建一個(gè)Token對象
use Zend\Expressive\Authentication\Jwt\Token; $token = new Token([ 'sub' =>'1234567890', 'name' =>'John Doe', 'iat' =>time(), 'exp' =>time() + 3600, ]);以上代碼中,我們創(chuàng)建了一個(gè)JWT Token,其中sub是用戶的唯一標(biāo)識,name是用戶的名稱,iat是token生成時(shí)間的時(shí)間戳,exp是token過期時(shí)間的時(shí)間戳。其中,sub和exp是必須的參數(shù),而name和iat是可選參數(shù)。 2. 為Token對象簽名
use Zend\Expressive\Authentication\Jwt\Signer\Rsa\RsaSha256; use Zend\Expressive\Authentication\Jwt\Signer\SignerInterface; $privateKey = file_get_contents('path/to/private/key.pem'); $token->setPrivateKey($privateKey); $token->setPassPhrase('secret'); $token->setSigner(new RsaSha256()); $jwt = $token->generate();以上代碼中,我們使用了RsaSha256算法對我們的Token對象進(jìn)行簽名,通過調(diào)用generate方法,我們可以獲取到一個(gè)JWT字符串,其中包含了我們Token對象的信息。 若要驗(yàn)證一個(gè)JWT的有效性,我們則可以使用以下方式:
use Zend\Expressive\Authentication\Jwt\Token; $token = Token::fromString($jwt); if (!$token->verify()) { throw new Exception('Invalid JWT'); } $claims = $token->getClaims();以上代碼中,我們首先從JWT字符串中創(chuàng)建了一個(gè)Token對象,然后調(diào)用verify方法判斷JWT是否有效,若有效則調(diào)用getClaims方法獲取JWT中包含的數(shù)據(jù)。 總而言之,JWT是一種輕便、安全、靈活的身份驗(yàn)證和授權(quán)方式,在PHP中,我們可以使用Zend框架來輔助我們創(chuàng)建和驗(yàn)證JWT,提高我們應(yīng)用程序的效率和安全性。
上一篇jvavhe+php
下一篇jvm跑php