话不多说,直接上示例
<?php
/**
* Created by PhpStorm
* User: xxx 根据自己情况设置
* Date: 2024/3/20
* Time: 15:53
* Brief:
* docs:
*/
namespace App\lib\jwt;
use App\Exceptions\BaseException;
use Exception;
use Firebase\JWT\JWT;
use Firebase\JWT\Key;
class JwtUtil
{
//编码
public function encode()
{
$key = env('JWT_SECRET'); //key要和签发的时候一样
$time = time(); //当前时间
$token = [
'iss' => 'http://www.helloweba.net', //签发者 可选
'aud' => 'http://www.helloweba.net', //接收该JWT的一方,可选
'iat' => $time, //签发时间
'nbf' => $time, //(Not Before):某个时间点后才能访问,比如设置time+30,表示当前时间30秒后才能使用
'exp' => $time + 7200, //过期时间,这里设置2个小时
'data' => [ //自定义信息,不要定义敏感信息
'userid' => 1,
'username' => '李小龙'
]
];
$keyId = "keyId";
return JWT::encode($token, $key, 'HS256',$keyId); //输出Token,指定签发方式
}
//解码
public function decode($jwt)
{
$key_1 = env('JWT_SECRET'); //key要和签发的时候一样
try {
JWT::$leeway = 60;//当前时间减去60,把时间留点余地
$key = new Key($key_1, 'HS256');
$decoded = JWT::decode($jwt, $key ); //HS256方式,这里要和签发的时候对应
$arr = (array)$decoded;
return $arr;
} catch (\Firebase\JWT\SignatureInvalidException $e) { //签名不正确
throw new BaseException(100,'令牌错误');
} catch (\Firebase\JWT\BeforeValidException $e) { // 签名在某个时间点之后才能用
throw new BaseException(200,'令牌未开始使用');
} catch (\Firebase\JWT\ExpiredException $e) { // token过期
throw new BaseException(300,'令牌已过期');
} catch (Exception $e) { //其他错误
throw new BaseException(500,$e->getMessage());
}
}
}
这里有一个比较坑的地方,JWT::decode()中第二个参数,是一个对象