mbtdr3ev - 4天前注册会员;
3n44fZgo - 23天前注册会员;
73n5lsCR - 37天前注册会员;
NaZ2pUfG - 46天前注册会员;
bwpKIZwD - 95天前注册会员;
加入我们(62 )

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 的安全性,应该采取足够的安全措施,并在设计和实现时考虑到攻击者可能使用的不同攻击方式。

声明:本站原创文章文字版权归本站所有,转载务必注明作者和出处;本站转载文章仅仅代表原作者观点,不代表本站立场,图文版权归原作者所有。如有侵权,请联系我们删除。