php使用jwt验证

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"
    }
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值