前期准备
使用 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();
}
}
至此完成。