什么是JWT
JWT验证(JSON Web Token验证)是一种用于身份验证和授权的标准化方法,它基于JSON格式的令牌。JWT是一种轻量级、自包含的令牌,通常用于Web应用程序和API之间的身份验证和授权。
为什么要使用JWT
1.服务器不需要在内存中维护会话信息,因为JWT令牌是自包含的。 2.JWT令牌可以包含任意数量的信息,以满足不同应用程序的需求。 3.JWT令牌可以使用签名进行保护,确保令牌的真实性。 4.JWT是标准化的,因此可以在不同的编程语言和平台上使用。
PHP实现步骤
操作系统:Windows (如果是mac或者Linux的,除了Composer
的安装方式不同,其他的是一样的)
本文为了方便展示没有使用PHP的框架,请注意目录结构
安装
1.安装Composer
JWT需要使用Composer
安装,如果还没有安装,请先下载安装包 getcomposer.org/download/
下载后是一个exe,直接运行会自动设置PATH环境变量。
安装完成后CMD运行composer --version
查看版本号,正常显示则安装成功。
2.安装JWT依赖
composer require firebase/php-jwt
下载完成后文件夹会出现这些文件
这是我的目录结构,仅供参考
使用
1.生成JWT 在用户登录成功后,我们需要生成一个JWT令牌,其中包含一些用户信息之类的数据,需要设置一个秘钥,生成JWT和解析使用。
// 生成JWT
$jwtSecretKey = MY_KEY; // 替换为你的密钥
$payload = array(
"userID" => $userID,
"username" => $username,
"exp" => time() + (60 * 60 * 24) // 设置过期时间为1小时
);
$jwtToken = JWT::encode($payload, $jwtSecretKey, "HS256");
// 登录成功,把数据返回给前端
echo json_encode(["code" => 200, "data" => ["username" => $username, "name" => $Name, "token" => $jwtToken]]);
2.解析JWT
$_SERVER['HTTP_TOKEN'
是获取请求头中是否携带了TOKEN,这里模拟的是用户登录后的请求,当用户携带token后,我们获取到token进行解析,解析成功可以获取到对应的信息。当然这里只是演示,具体的逻辑需要根据你的业务逻辑来对代码进行改写。
if(isset($_SERVER['HTTP_TOKEN'])) {
$key = MY_KEY;
$jwt = $_SERVER['HTTP_TOKEN'];
try {
$decoded = JWT::decode($jwt, new Key($key, 'HS256'));
// echo json_encode(["code" => "200", "msg" => $decoded], JSON_UNESCAPED_UNICODE);
return $decoded;
} catch (Exception $e) {
echo json_encode(["code" => 10001, "res"=>$jwt, "msg" => '解析或验证 JWT 失败:' . $e->getMessage()], JSON_UNESCAPED_UNICODE);
return false;
}
}else {
echo json_encode(["code" => 10001, "msg" => '未登录']);
return false;
}
上述代码是模拟的登录成功后,PHP需要返回给前端的数据,php把token返回给前端,前端获取token后在请求头带上token请求。PHP对请求头中的token进行解析,根据不同的情况返回不同的信息给到前端。
这里整体的登录逻辑就是,前端通过访问登录接口,把用户输入的信息传给后端,后端获取到对应的信息去数据库进去匹配,成功后根据对应的信息生成JWT返回给前端。前端拿到JWT后,根据需求把token添加到请求头,每次请求都携带这个token,后端根据这个token对其进行相应的操作。
但是,需要谨慎处理JWT令牌的安全性,确保不在令牌中存储敏感信息,因为令牌内容是可解码的。密钥的保护也是非常重要的,以防止令牌被篡改。