首页 > 文章列表 > 通过PHP-JWT来实现JSON Web Token的PHP应用

通过PHP-JWT来实现JSON Web Token的PHP应用

php json jwt
458 2024-03-26

JSON Web Token(JWT)是一个用于在网络应用中传递身份验证和声明信息的开放标准(RFC 7519)。JWT是由头部、载荷和签名组成的字符串,可以安全地传输数据,包括在请求和响应中使用。它可以被用于一个无状态的分布式 Web 应用,因为它具有一致和标准化的方式来实现认证和授权。

在本篇文章中,我们将向您介绍如何使用PHP和PHP-JWT来实现JWT(JSON Web Token)。我们将介绍JWT的基础知识,解析JWT并使用PHP-JWT进行签名和验证JWT的过程。

一、JWT 简介

JWT 是一个基于 JSON 的开放标准(RFC 7519),用于在不同系统之间传输声明信息。使用 JWT,可以将信息安全地包含在 token 中,这个 token 可以被安全地传输和验证。JWT 由三部分组成:头部(Header)、载荷(Payload)和签名(Signature)。

  1. 头部

JWT 的头部包含两个部分:令牌类型和使用的加密算法。头部通常是一个 JSON 对象,类似于以下内容:

{
"alg": "HS256",
"typ": "JWT"
}

"alg" 表示用于签名的算法。支持的算法有 HMAC SHA256(HS256), HMAC SHA384(HS384)和 HMAC SHA512(HS512)。"typ" 表示令牌类型,这里是 JWT。

  1. 载荷

载荷包含需要传输的声明或信息。这些声明可以包含用户身份信息、权限声明等。通常情况下,它也是一个 JSON 对象。例如:

{
"sub": "1234567890",
"name": "John Doe",
"iat": 1516239022
}

"sub" 表示主题(Subject),此字段唯一标识 JWT 的所有者。"name" 表示 JWT 所属用户的名称。"iat"(issued at)表示 JWT 的创建时间。其他声明信息在实际使用中可以根据需要自定义。

  1. 签名

使用上述两个部分,使用指定的加密算法生成签名。签名可以保证 JWT 在传输过程中不被篡改。JWT 的签名可以使用共享密钥(例如 HMAC)或公钥/私钥(例如 RSA)生成。

二、使用 PHP-JWT 库实现 JWT

现在我们已经介绍了 JWT 的基本概念,让我们看看如何使用 PHP-JWT 库实现 JWT。PHP-JWT 是一个 PHP JSON Web Token 库,可以在 PHP 5.3 及以上版本上使用。它支持以下算法:HS256、HS384、HS512、RS256、RS384、RS512、ES256、ES384、ES512 以及 PS256、PS384、PS512。

  1. 安装 PHP-JWT

首先,通过 Composer 安装 PHP-JWT:

composer require firebase/php-jwt

  1. 生成 JWT

要生成 JWT,我们需要指定一个秘钥,并使用 JWT 的 API 生成一个 token。以下是如何生成 JWT 的代码示例:

$secretKey = 'your_secret_key'; // 您的秘钥

$payload = array(

"sub" => "1234567890",
"name" => "John Doe",
"iat" => time()

);

$jwt = JWT::encode($payload, $secretKey, 'HS256');

echo $jwt;

在上面的例子中,我们指定了一个 sub、name 和 iat 声明。我们调用 JWT::encode() 方法来生成 JWT,并使用指定的秘钥和签名算法进行签名。最后,我们打印出生成的 JWT。

  1. 验证 JWT

从安全性角度考虑,我们需要验证从客户端发送的 JWT 是否正确。我们使用 PHP-JWT 库的 decode 方法来解码 JWT 并验证签名。以下是如何解码和验证 JWT 的代码示例:

$jwt = 'your_jwt'; // 您的 JWT

$secretKey = 'your_secret_key'; // 您的秘钥

try {

$decoded = JWT::decode($jwt, $secretKey, array('HS256'));
print_r($decoded);

} catch (Exception $e) {

echo $e->getMessage();

}

在上面的代码中,我们调用 JWT::decode() 方法来解码和验证 JWT。如果 JWT 无效或已过期,则会引发异常。否则,我们打印出解码 JWT 后的声明信息。

  1. 刷新 JWT

JWT 的有效期通过 iat 和 exp 申明来设置,exp 申明指定了 JWT 的失效时间戳。可以使用 PHP-JWT 库来验证 JWT 是否过期,如以下示例所示:

$jwt = 'your_jwt'; // 您的 JWT

$secretKey = 'your_secret_key'; // 您的秘钥

/*

  • 验证 JWT 是否过期
    */

$decodedData = JWT::decode($jwt, $secretKey, array('HS256'));
$expirationTimeInSeconds = $decodedData->exp - $decodedData->iat;

if ($expirationTimeInSeconds <= 0) {

throw new Exception('JWT 已过期,需要重新登录!');

} else if ($expirationTimeInSeconds > 0 && $expirationTimeInSeconds <= 1800) {

/*
 * 刷新 JWT
 */
$payload = array(
    "sub" => "1234567890",
    "name" => "John Doe",
    "iat" => time()
);

$jwt = JWT::encode($payload, $secretKey, 'HS256');

}

在上面的代码中,我们验证 JWT 是否过期,如果过期,抛出异常。如果尚未过期但离过期时间较近,我们可以刷新 JWT。

  1. 其他选项

PHP-JWT 还提供了其他一些设置选项,例如指定加密算法和过期时间:

$payload = array(

"sub" => "1234567890",
"name" => "John Doe",
"iat" => time(),
"exp" => time() + 3600 // 过期时间为一小时

);

$options = array(

'algorithm' => 'HS256'

);

$jwt = JWT::encode($payload, $secretKey, 'HS256', $options);

在上面的代码中,我们指定了 exp 选项来设置 JWT 的过期时间,以及 algorithm 选项来设置使用的签名算法。

总结

在本篇文章中,我们介绍了 JSON Web Token(JWT)的基础知识,学习了如何使用 PHP-JWT 实现 JWT。我们还介绍了生成 JWT、验证 JWT、刷新 JWT 和其他一些选项。希望这篇文章能够帮助您理解如何在 PHP 应用中实现 JWT。