composer安装依赖
composer require firebase/php-jwt
const key = 'key_for_jwt';
const alg = 'HS256';
// 过期时间
const exp_time = 86400;
三个参数根据业务需求自行设置就好
生成jwt代码:
/**
* @Notes: 生成jwt token
* @param array $param
* @return string
* @Time: 2024/5/9 下午2:52
*/
public static function createJwtToken(array $param = []): string
{
$jwtData = [
'lat' => time(),
'nbf' => time(),
'exp' => bcadd(time(), self::exp_time),
];
unset($param['lat'], $param['nbf'], $param['exp']);
$jwtData = array_merge($jwtData, $param);
return JWT::encode($jwtData, self::key, self::alg);
}
生成如下结果:
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJsYXQiOjE3MTUzMjM4NDgsIm5iZiI6MTcxNTMyMzg0OCwiZXhwIjoiMTcxNTMyNDg0OCIsInVzZXJfaWQiOjEwMDg2fQ.afHvKlWLolLItnBvuOe33ZoBJndl8rBU_rCh-QOGwqA
解析jwt代码
/**
* @Notes:解析jwt token
* @param string $token
* @return array
* @Time: 2024/5/9 下午2:55
*/
public static function parseJwtToken(string $token): array
{
return (array)JWT::decode($token, new Key(self::key, self::alg));
}
解析结果:
Array
(
[lat] => 1715323848
[nbf] => 1715323848
[exp] => 1715324848
[user_id] => 10086
)
要注意的是, JWT有很多Exception,最好做兼容
/**
* @Notes: 校验token
* @param string $token
* @return array
* @Time: 2024/5/9 下午3:05
*/
public static function checkJwtToken(string $token): array
{
$jwtData = [];
try {
$jwtData = self::parseJwtToken($token);
} catch (ExpiredException|SignatureInvalidException|BeforeValidException $e) {
return [false, $jwtData];
}
if (empty($jwtData)) {
return [false, $jwtData];
}
if (time() > $jwtData['exp']) {
return [false, $jwtData];
}
return [true, $jwtData];
}