JWT 与 PHP 的简单使用

前期准备

使用 Composer 下载所需的准备材料。

cd ... #网站根目录
composer require firebase/php-jwt

在 PHP 文件中,需要写入下面的代码,注意目录路径,这里是相对于根目录。

require __DIR__ . '/vendor/autoload.php';
use Firebase\JWT\JWT;

令牌创建

我们使用 Cookie 储存 JWT。

我们需要创建一个自定义字符串作密钥,这里我们存在一个名为key-999d-45a2-a2b3.php的文件中:

<?php
    $key = 'cptbtptp233';
?>

核心部分代码:

// $audience 是用户名。
// $exp 是失效时间,这里设为 1 天。

require 'key-999d-45a2-a2b3.php';
$exp = time() + 24 * 60 * 60;

$payload = array(
"aud" => $audience,
"exp" => $exp
);

$jwt = JWT::encode($payload, $key);
setcookie("token",$jwt,$exp);

值得注意的是,firebase/php-jwt 支持多种不同的算法,在JWT::encode()第三个参数省缺的情况下默认为 HS256 。可以在 https://jwt.io/#libraries-io 查看。若要使用其他算法,例如 HS512 ,需要上述代码将倒数第二行更为:

$jwt = JWT::encode($payload, $key, 'HS512');

令牌校验

创建好后我们就可以根据令牌校验。

require 'key-999d-45a2-a2b3.php';
if(isset($_COOKIE['token'])){
    //如果 COOKIE 存在
    $jwt = $_COOKIE['token'];
    try{
        $decoded = JWT::decode($jwt, $key, array('HS256'));
        $uid = $decoded -> aud; //用户ID
        $exp = $decoded -> exp; //JWT有效期

        if(time() < $exp) $ifLogin = true; //JWT也没过期,通过校验
    } catch(Exception $e){
            //如果JWT被篡改
            echo '你这 JWT 有问题啊:'.$e->getMessage();
    }
}

至此完成。

添加新评论