JWT的Payload部分,我们可以把它想象成“通行证”里面的主要内容区域。这部分描述了通行证持有者的信息和他们所拥有的权限。
Payload通常包含的内容:
注册声明(Registered Claims):这是一些预定义好的声明,比如
iss(发行人)、sub(主题)、aud(受众)、exp(过期时间)等。它们都是关于JWT的标准信息。公开声明(Public Claims):这些是JWT的创建者可以自定义的声明,但是需要避免与注册声明冲突。
私有声明(Private Claims):这些是创建者为了特定目的而自定义的声明,比如用户的ID、角色等。
底层原理:
Payload部分其实就是一个JSON对象,它被编码(但不是加密)成Base64Url格式,这样可以确保数据在网络中安全地传输,而不会被特殊字符干扰。重要的是要知道,虽然Payload被编码了,但它不是加密的,所以不应该包含敏感信息。
通俗解释:
想象Payload部分就像你学生证里的信息栏,上面有你的姓名、学号、班级等基本信息,这些信息对于识别你的身份很重要,但它们并不是秘密信息,因为别人拿到你的学生证也能看到这些信息。JWT的Payload也是这样,它包含了识别用户或请求所必需的信息,但这些信息不是保密的。
PHP实例代码:
下面是一个简单的PHP代码示例,用于创建一个JWT,并查看其Payload部分:
<?php require 'vendor/autoload.php'; // 引入JWT库,假设你已经通过Composer安装了firebase/php-jwt use \Firebase\JWT\JWT; $key = "your_secret_key"; // 用于签名JWT的密钥 $payload = array( "user_id" => 12345, // 自定义的用户ID "username" => "JohnDoe", // 自定义的用户名 "iat" => time(), // JWT的签发时间 "exp" => time() + 3600 // JWT的过期时间,设置为1小时后 ); // 编码并签名JWT $jwt = JWT::encode($payload, $key); echo "JWT: " . $jwt . "\n"; // 仅仅为了演示,我们将Payload部分单独提取出来查看 list($headb64, $payb64, $sigb64) = explode('.', $jwt); $payload_decoded = base64_decode($payb64); $payload_json = json_decode($payload_decoded, true); echo "Payload部分解码后的内容:\n"; print_r($payload_json); ?>在这个例子中,我们首先定义了一个$payload数组,里面包含了用户ID、用户名、JWT的签发时间和过期时间。然后,我们使用JWT库将这个Payload编码并签名成一个完整的JWT。最后,为了演示,我们将JWT分解,并单独解码了Payload部分来查看其内容。
注意:在实际应用中,你应该始终通过HTTPS来传输JWT,以确保其安全性。而且,Payload中不应该包含任何敏感信息,因为它只是被编码而不是被加密。