JWT的Token可以被撤销吗?
JWT(JSON Web Token)本身并没有内置的撤销机制。一旦JWT被签发,它就会在有效期内一直有效,除非它的有效期(exp声明)到期。但是,有一些方法可以实现JWT的撤销或使其无效。
底层原理:
- Token黑名单:在服务器端维护一个被撤销的Token黑名单。当需要检查Token是否有效时,服务器会查看该Token是否在黑名单中。如果在,则拒绝访问。
- Token有效期:设置较短的有效期,并定期刷新Token。这样,即使一个Token被泄露,它的有效期也会很快到期,降低风险。
- 使用单独的认证服务器:通过OAuth等协议,使用认证服务器来管理Token的发放和撤销。认证服务器可以记录已发放的Token,并能够实现撤销操作。
通俗地说,撤销JWT的Token就像是你有一张游乐园的门票,这张门票本身没有过期时间,但游乐园可以在门口列一个“无效门票”清单。如果你的门票在这个清单上,即使你的门票看起来没问题,游乐园也不会让你进去。另一种方法是,游乐园可以给你的门票设置一个很短的有效期,比如一个小时,然后你需要定期去换票。
完整的PHP实例代码(使用黑名单方法):
以下是一个简单的PHP示例,展示如何使用黑名单来撤销JWT Token:
<?php require_once 'vendor/autoload.php'; // 引入JWT库 use \Firebase\JWT\JWT; $key = "your_secret_key"; // JWT密钥 $blacklist = ['revoked_token1', 'revoked_token2']; // 假设的黑名单列表 function isTokenRevoked($token, $blacklist) { return in_array($token, $blacklist); } function verifyToken($token, $key, $blacklist) { try { $decoded = JWT::decode($token, $key, array('HS256')); // 检查Token是否在黑名单中 if (isTokenRevoked($token, $blacklist)) { throw new Exception('Token has been revoked.'); } // Token验证成功且未撤销 return $decoded; } catch (Exception $e) { // Token验证失败或已被撤销 return false; } } // 假设我们有一个待验证的Token $jwtToken = 'your_jwt_token_here'; // 这里替换为你的JWT Token // 验证Token并检查是否撤销 $result = verifyToken($jwtToken, $key, $blacklist); if ($result) { echo "Token is valid and not revoked."; } else { echo "Token is invalid or revoked."; } ?>在这个示例中,我们定义了一个$blacklist数组来模拟被撤销的Token列表。verifyToken函数用于验证Token并检查它是否在黑名单中。如果Token在黑名单中,则抛出一个异常表示Token已被撤销。