PHP JWT验证示例学习
html代码
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>JWT验证示例</title>
</head>
<body>
<h1>JWT验证示例</h1>
<div>
<button id="loginBtn">登录</button>
<button id="logoutBtn">退出</button>
</div>
<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
<script src="index.js"></script>
</body>
</html>
js代码
$(document).ready(function() {
// 登录按钮点击事件
$("#loginBtn").click(function() {
// 发送POST请求到api.php,请求生成JWT
$.ajax({
url: "api.php",
method: "POST",
data: {
action: "login"
},
success: function(response) {
// 将JWT存储在本地存储中
localStorage.setItem("jwt", response.jwt);
alert("登录成功!");
},
error: function(jqXHR, textStatus, errorThrown) {
console.log(jqXHR);
console.log(textStatus);
console.log(errorThrown);
alert("登录失败!");
}
});
});
// 退出按钮点击事件
$("#logoutBtn").click(function() {
// 删除本地存储中的JWT
localStorage.removeItem("jwt");
alert("退出成功!");
});
});
php代码
<?php
// 引入php-jwt库
require_once("vendor/autoload.php");
use \Firebase\JWT\JWT;
// 设置密钥
$secret = "mysecret";
// 获取POST请求中的动作
$action = isset($_POST["action"]) ? $_POST["action"] : "";
// 如果请求为登录,则生成JWT并返回
if ($action === "login") {
// 设置JWT有效期为10分钟
$expTime = time() + (10 * 60);
// 设置JWT的荷载
$payload = array(
"iss" => "example.com", // 签发者
"exp" => $expTime, // 过期时间
"sub" => "1234567890", // 主题
"iat" => time() // 签发时间
);
// 使用php-jwt库生成JWT
$jwt = JWT::encode($payload, $secret);
// 返回JWT
header("Content-Type: application/json");
echo json_encode(array("jwt" => $jwt));
} else {
// 否则,检查JWT是否有效
$headers = apache_request_headers();
$jwt = isset($headers["Authorization"]) ? $headers["Authorization"] : "";
try {
// 使用php-jwt库验证JWT
JWT::decode($jwt, $secret, array("HS256"));
http_response_code(200);
} catch (Exception $e) {
http_response_code(401);
}
}
js取出
// 从localStorage中获取JWT
const token = localStorage.getItem('jwt');
// 将JWT解析为一个JavaScript对象
const decodedToken = JSON.parse(atob(token.split('.')[1]));
// 获取JWT的过期时间
const expTime = decodedToken.exp;
// 获取当前时间
const currentTime = Math.floor(Date.now() / 1000);
// 判断JWT是否已经过期
if (expTime < currentTime) {
// JWT已经过期
} else {
// JWT未过期,用户已登录
}
关于安全
在上面的例子中,JWT 可能被伪造。因为示例中使用的是 HMAC SHA256 签名算法,如果攻击者能够获取到共享密钥,就可以使用该密钥伪造有效的 JWT。另外,在示例中使用的是简单的自增数字作为用户 ID,如果攻击者知道这个规律,就可以在伪造 JWT 中使用任意的数字作为用户 ID。
为了增强 JWT 的安全性,应该采取一些安全措施,例如:
使用足够强大的密钥:密钥应该足够长且难以猜测。
使用加盐:可以在生成签名时使用一个随机的加盐值,以增加攻击者破解签名的难度。
定期更换密钥:定期更换密钥可以降低密钥泄露的风险。
使用公钥加密算法:可以使用公钥加密算法(如 RSA)代替 HMAC,从而更进一步地提高 JWT 的安全性。
总之,为了确保 JWT 的安全性,应该采取足够的安全措施,并在设计和实现时考虑到攻击者可能使用的不同攻击方式。
声明:本站原创文章文字版权归本站所有,转载务必注明作者和出处;本站转载文章仅仅代表原作者观点,不代表本站立场,图文版权归原作者所有。如有侵权,请联系我们删除。