JWT
JSON Web Token(JWT)是目前最流行的跨域身份驗證解決方案。 隨著技術的發展,分布式web應用的普及,通過session管理用戶登錄狀態成本越來越高,因此慢慢發展成為token的方式做登錄身份校驗,然后通過token去取redis中的緩存的用戶信息,隨著之后jwt的出現,校驗方式更加簡單便捷化,無需通過redis緩存,而是直接根據token取出保存的用戶信息,以及對token可用性校驗,單點登錄更為簡單。
組件要求
- php: >=7.1.0
- ext-openssl: >=1.0.0
- easyswoole/spl: ^1.2
- easyswoole/utility: ^1.1
安裝方法
composer require easyswoole/jwt
倉庫地址
核心類庫方法
編碼相關
設置加密方式,默認HMACSHA256
function algMethod(string $method):Jwt
設置秘鑰,默認Easyswoole
function setSecretKey(string $key):Jwt
初始化一個沒有附帶信息的token的JwtObject
public function publish():JwtObject
設置加密方式, 默認HMACSHA256
public function setAlg($alg): self
設置用戶
public function setAud($aud): self
設置過期時間
public function setExp($exp): self
設置發布時間
public function setIat($iat): self
設置發行人
public function setIss(string $iss): self
設置jwt-id,用于標識該jwt
public function setJti($jti): self
在此之前不可用
public function setNbf($nbf): self
設置主題
public function setSub($sub): self
設置其他數據
public function setData($data): self
獲取token
function __toString()
解碼相關
解碼
public function decode(?string $raw):?JwtObject
獲取解碼狀態, 1:通過, -1:無效, -2:token過期
public function getStatus(): int
獲取加密方式
public function getAlg()
獲取用戶
public function getAud()
獲取過期時間
public function getExp()
獲取發布時間
public function getIat()
獲取發行人
public function getIss(): string
獲取jwt-id
public function getJti()
獲取生效時間
public function setNbf($nbf): void
獲取主題
public function getSub()
獲取自定義數據
public function getData()
獲取簽名
public function getSignature()
通過key獲取相關數據
final public function getProperty($name)
基本使用
生成token
use EasySwoole\Jwt\Jwt;
$jwtObject = Jwt::getInstance()
->setSecretKey('easyswoole') // 秘鑰
->publish();
$jwtObject->setAlg('HMACSHA256'); // 加密方式
$jwtObject->setAud('user'); // 用戶
$jwtObject->setExp(time()+3600); // 過期時間
$jwtObject->setIat(time()); // 發布時間
$jwtObject->setIss('easyswoole'); // 發行人
$jwtObject->setJti(md5(time())); // jwt id 用于標識該jwt
$jwtObject->setNbf(time()+60*5); // 在此之前不可用
$jwtObject->setSub('主題'); // 主題
// 自定義數據
$jwtObject->setData([
'other_info'
]);
// 最終生成的token
$token = $jwtObject->__toString();
解析token
use EasySwoole\Jwt\Jwt;
$token = "eyJhbGciOiJITUFDU0hBMjU2IiwiaXNzIjoiZWFzeXN3b29sZSIsImV4cCI6MTU3MzgzNTIxMSwic3ViIjoi5Li76aKYIiwibmJmIjoxNTczODMxOTExLCJhdWQiOiJ1c2VyIiwiaWF0IjoxNTczODMxNjExLCJqdGkiOiJjYWJhZmNiMWIxZTkxNTU3YzIxMDUxYTZiYTQ0MTliMiIsInNpZ25hdHVyZSI6IjZlNTI1ZjJkOTFjZGYzMjBmODE1NmEwMzE1MDhiNmU0ZDQ0YzhkNGFhYzZjNmU1YzMzMTNjMDIyMGJjYjJhZjQiLCJzdGF0dXMiOjEsImRhdGEiOlsib3RoZXJfaW5mbyJdfQ%3D%3D";
try {
$jwtObject = Jwt::getInstance()->decode($token);
$status = $jwtObject->getStatus();
// 如果encode設置了秘鑰,decode 的時候要指定
// $status = $jwt->setSecretKey('easyswoole')->decode($token)
switch ($status)
{
case 1:
echo '驗證通過';
$jwtObject->getAlg();
$jwtObject->getAud();
$jwtObject->getData();
$jwtObject->getExp();
$jwtObject->getIat();
$jwtObject->getIss();
$jwtObject->getNbf();
$jwtObject->getJti();
$jwtObject->getSub();
$jwtObject->getSignature();
$jwtObject->getProperty('alg');
break;
case -1:
echo '無效';
break;
case -2:
echo 'token過期';
break;
}
} catch (\EasySwoole\Jwt\Exception $e) {
}