JWT文档 : Overview - lcobucci/jwt
JWT包 : JSON Web Tokens - jwt.io
JWT(Json Web Token) : 简单来说就是用来让服务器端判断请求是由信任的客户端发送的
JWT的组成
头部 (header)
负载 (payload) 用于存储一些自定义信息
签证 (signature)
# header :
{
"typ" : "JWT", # 声明类型为JWT
"alg" : "HS256" # 声明算法为HS256
}
# payload :
{
"iss" : "chino", # 签发者
"sub" : "chieri", # 面向的用户
"iat" : "1684718404", # 生成时间
"nbf" : "1684718404", # 生效时间
"exp" : "1684718405", # 过期时间
"data" : { # 自定义字段
"id" : 1,
"name" : "Chieri"
}
}
# 生成的token
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.
eyJpc3MiOiJjaGlubyIsImF1ZCI6ImNoaWVyaSIsImlhdCI6MTY4NDcxOTM2OSwibmJmIjoxNjg0NzE5MzY5LCJleHAiOjE2ODQ3MTk0NTUsIjAiOjQwMCwiZGF0YSI6eyJpZCI6MSwibmFtZSI6ImNoaWVyaSJ9fQ.
s5C7tR2UzOhuID72WGNZGVC1tfDcVwANc3bwjR3YMwM
# 生成的token用.进行隔离
# header.payload.signature
JWT示例
jwt有很多种包 可以通过上面的JWT包下载 这里使用的是firebase/jwt
composer require firebase/php-jwt # 下拉jwt
<?php
namespace app\auth;
use Firebase\JWT\JWT;
use Firebase\JWT\Key;
class JwtAuth
{
private $key = 'chino'; # 签发key
private $alg = 'HS256'; # 加密方式
# 生成token
public function setToken(){
$token = [
'iss' => 'chino', # 签发人 可以为空
'aud' => 'chieri', # 接收人 可以为空
'iat' => time(), # 签发时间
'nbf' => time(), # 生效时间
'exp' => time()+86400, # 过期时间 +86400s = + 1天
'data' => [ # 自定义数据
'id' => 1,
'name' => 'chieri',
]
];
return JWT::encode($token , $this->key , $this->alg);
}
public function checkToken(){
$token = "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.
eyJpc3MiOiJjaGlubyIsImF1ZCI6ImNoaWVyaSIsImlhdCI6MTY4NDcxOTc4MiwibmJmIjoxNjg0NzE5NzgyLCJleHAiOjE2ODQ4MDYxODIsImRhd
GEiOnsiaWQiOjEE2ODQ4MDYxODIsImRhdGEiOnsiaWQiOjEsIm5hbWUiOiJjaGllcmkifX0.
ME2a23yIYX2QfjcccdpL_QBf0EPrgKNfaj2kH6SnKcU";
# 生成的token
try {
JWT::$leeway = 60; # 当前时间-60 留点时间
return (array)JWT::decode($token , new Key($this->key , $this->alg)); # new key(生成token时的key , 生成token时的加密模式)
}catch (\Exception $exception){ # Firebase定义了很多异常捕获 但是这里我懒所以没有写更多的catch捕获业务
return $exception->getMessage();
}
}
}
# 调用setToken()返回结果
"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJjaGlubyIsImF1ZCI6ImNoaWVyaSIsImlhdCI6MTY4NDcyMTMwMSwibmJmIjoxNjg0NzIxMzAxLCJleHAiOjE2ODQ4MDc3MDEsImRhdGEiOnsiaWQiOjEsIm5hbWUiOiJjaGllcmkifX0.WCSEw_2urOnmDkJnoXNDjFMPYcTnMBkdcrIr67OIIzU"
# 调用checkToken()返回结果
{
"iss": "chino",
"aud": "chieri",
"iat": 1684719782,
"nbf": 1684719782,
"exp": 1684806182,
"data": {
"id": 1,
"name": "chieri"
}
}