59 lines
1.9 KiB
PHP
59 lines
1.9 KiB
PHP
<?php
|
|
|
|
namespace app\mzl\common\utils;
|
|
|
|
use Firebase\JWT\JWT;
|
|
use Firebase\JWT\Key;
|
|
use Firebase\JWT\ExpiredException;
|
|
use Firebase\JWT\SignatureInvalidException;
|
|
use support\exception\BusinessException;
|
|
|
|
class JwtUtil
|
|
{
|
|
/**
|
|
* 生成 JWT Token
|
|
* @param int|string $userId
|
|
* @return string
|
|
*/
|
|
public static function generateToken($userId): string
|
|
{
|
|
$config = config('jwt');
|
|
$payload = [
|
|
'iss' => 'webman', // 签发者
|
|
'aud' => 'client', // 接收方
|
|
'iat' => time(), // 签发时间
|
|
'exp' => time() + $config['expire'], // 过期时间
|
|
'sub' => $userId // 用户标识
|
|
];
|
|
return JWT::encode($payload, $config['secret'], $config['algorithm']);
|
|
}
|
|
|
|
/**
|
|
* 验证并解析 Token
|
|
* @param string $token
|
|
* @return object
|
|
* @throws BusinessException
|
|
*/
|
|
public static function verifyToken(string $token)
|
|
{
|
|
$config = config('jwt');
|
|
$body = [
|
|
'status' => 'error',
|
|
'code' => 403,
|
|
'message' => 'Please log in.',
|
|
'data' => [],
|
|
];
|
|
try {
|
|
return JWT::decode($token, new Key($config['secret'], $config['algorithm']));
|
|
} catch (ExpiredException $e) {
|
|
$body['message'] = 'Token Expired';
|
|
return response(json_encode($body, JSON_UNESCAPED_UNICODE), 401, ['Content-Type' => 'application/json']);
|
|
} catch (SignatureInvalidException $e) {
|
|
$body['message'] = 'Signature Invalid';
|
|
return response(json_encode($body, JSON_UNESCAPED_UNICODE), 401, ['Content-Type' => 'application/json']);
|
|
} catch (\Exception $e) {
|
|
$body['message'] = 'Invalid Token';
|
|
return response(json_encode($body, JSON_UNESCAPED_UNICODE), 401, ['Content-Type' => 'application/json']);
|
|
}
|
|
}
|
|
} |