1. 什么是JWT
JWT全称Json Web Token,是一种安全的身份验证机制。其最大的优势在于,客户端提交过来一个JWT,服务器只需要解密这个JWT,即可得到里面包含的信息。这就避免了服务器在验证身份时需要查询数据库或者缓存等操作,减轻了服务器的负担。
JWT由三部分组成:
Header:存储加密算法,例如:{"alg": "HS256", "typ": "JWT"}。
Payload:存储具体的信息,例如:{"sub": "1234567890", "name": "John Doe", "iat": 1516239022}。
Signature:用来验证JWT是否被篡改,需要使用服务器端保存的密钥进行签名
2. 如何在php中使用JWT
2.1 安装JWT库
我们可以使用官方提供的JWT库来实现对JWT的操作。在终端中使用以下命令:
composer require firebase/php-jwt
2.2 生成token
我们可以使用JWT库提供的API来生成token,生成token需要服务器端的密钥和一个有效期。示例代码如下:
use Firebase\JWT\JWT;
$payload = array(
"sub" => "1234567890",
"name" => "John Doe",
"iat" => time(),
"exp" => time() + 3600
);
$jwt = JWT::encode($payload, $key);
其中,$key是我们在服务器端保存的密钥,3600表示token的有效期为1小时。
2.3 解码payload
我们可以使用JWT库提供的API来解码payload,验证token是否被篡改,示例代码如下:
use Firebase\JWT\JWT;
try {
$decoded = JWT::decode($jwt, $key, array('HS256'));
$data = (array) $decoded;
// $data是一个数组,包含了解码后的payload信息
} catch (Exception $e) {
// token解码失败
}
其中,$key是我们在服务器端保存的密钥,array('HS256')表示采用HS256算法进行验证。
2.4 校验token
我们可以使用JWT库提供的API来校验token是否合法,示例代码如下:
use Firebase\JWT\JWT;
try {
$decoded = JWT::decode($jwt, $key, array('HS256'));
// token合法
} catch (Exception $e) {
// token验证失败
}
其中,$key是我们在服务器端保存的密钥,array('HS256')表示采用HS256算法进行验证。
3. PHP中使用JWT的优缺点
3.1 优点
JWT不需要在服务器端存储用户的登录状态,只需要将有效期内的token存储在客户端即可,减轻了服务器的负担;
JWT可以自定义存储在payload中的信息,可以避免多次查询数据库或者缓存等操作,提高了效率。
3.2 缺点
JWT没有自动的刷新机制,一旦有效期过期,需要客户端重新向服务器请求更新token;
尽管JWT的payload中可以存储一些敏感信息,但是服务器端仍然需要保留一些敏感信息,例如用户的密码等。