在PHP中,使用JSON Web Tokens(JWT)处理刷新令牌的过程如下:
- 安装JWT库:首先,你需要安装一个JWT库,例如
firebase/php-jwt
。你可以使用Composer进行安装:
composer require firebase/php-jwt
- 生成访问令牌和刷新令牌:当用户登录时,除了生成访问令牌(access token)之外,还需要生成一个刷新令牌(refresh token)。访问令牌具有较短的有效期,而刷新令牌具有较长的有效期。
use Firebase\JWT\JWT; use Firebase\JWT\Key; // 假设你已经验证了用户的身份 $userId = 1; $issuedAt = time(); $expirationTime = $issuedAt + 3600; // 访问令牌有效期为1小时 // 生成密钥 $key = "your-secret-key"; // 生成访问令牌 $accessToken = JWT::encode([ "iss" => "your-issuer", "iat" => $issuedAt, "exp" => $expirationTime, "userId" => $userId ], $key); // 生成刷新令牌 $refreshExpirationTime = $issuedAt + 86400; // 刷新令牌有效期为1天 $refreshToken = JWT::encode([ "iss" => "your-issuer", "iat" => $issuedAt, "exp" => $refreshExpirationTime, "userId" => $userId ], $key);
-
存储刷新令牌:将生成的刷新令牌存储在数据库或会话中,以便在访问令牌过期时使用。
-
验证访问令牌:当用户发起请求时,需要验证访问令牌是否有效。如果访问令牌无效或已过期,返回错误信息并提示用户使用刷新令牌。
try { $decoded = JWT::decode($accessToken, new Key($key, 'HS256')); // 访问令牌有效,继续处理请求 } catch (Exception $e) { // 访问令牌无效或已过期,返回错误信息 echo "Invalid access token. Please use the refresh token."; }
- 使用刷新令牌获取新的访问令牌:当访问令牌过期时,可以使用刷新令牌向服务器发起请求以获取新的访问令牌。
try { $decoded = JWT::decode($refreshToken, new Key($key, 'HS256')); $issuedAt = time(); $expirationTime = $issuedAt + 3600; // 新的访问令牌有效期为1小时 // 生成新的访问令牌 $newAccessToken = JWT::encode([ "iss" => "your-issuer", "iat" => $issuedAt, "exp" => $expirationTime, "userId" => $decoded->userId ], $key); // 返回新的访问令牌给客户端 echo $newAccessToken; } catch (Exception $e) { // 刷新令牌无效或已过期,返回错误信息 echo "Invalid refresh token. Please login again."; }
- 撤销刷新令牌:为了防止刷新令牌被滥用,可以实现一个撤销刷新令牌的功能。当用户登出或发现异常行为时,可以将对应的刷新令牌加入黑名单,使其失效。在验证刷新令牌时,首先检查其是否在黑名单中。
// 假设你有一个黑名单数组
$refreshTokenBlacklist = [];
function isRefreshTokenRevoked($refreshToken) {
global $refreshTokenBlacklist;
return in_array($refreshToken, $refreshTokenBlacklist);
}
// 在验证刷新令牌之前检查是否已撤销
if (isRefreshTokenRevoked($refreshToken)) {
echo "Invalid refresh token. Please login again.";
} else {
try {
$decoded = JWT::decode($refreshToken, new Key($key, 'HS256'));
// 刷新令牌有效,继续处理请求
} catch (Exception $e) {
// 刷新令牌无效或已过期,返回错误信息
echo "Invalid refresh token. Please login again.";
}
}
通过以上步骤,你可以在PHP中使用JWT处理刷新令牌。请确保密钥的安全存储,并根据需要调整访问令牌和刷新令牌的有效期。