作者
发布于 2022-08-20 / 59 阅读
0
0

PHP JWT 生成和验证token

安装:

在项目根目录执行代码

composer require thans/tp-jwt-auth

composer require firebase/php-jwt

要是不行就多试几次,这个连接有点不稳定。

安装好后,在config里会多出一个文件

这样就是安装成功

然后创建一个server文件夹(这个无所谓),创建一个php类

<?php


namespace app\admin\Server; // 这个改成自己正常的地址,不然用不了,其他可以复制


use \Firebase\JWT\JWT;

class Token
{
    //生成token
    public function signToken($uid)
    {
        $key = '!@#$%*&';         //这里是自定义的一个随机字串,应该写在config文件中的,解密时也会用,相当    于加密中常用的 盐  salt
        $token = array(
            "iss" => $key,        //签发者 可以为空
            "aud" => '',          //面象的用户,可以为空
            "iat" => time(),      //签发时间
            "nbf" => time() + 3,    //在什么时候jwt开始生效
            "exp" => time() + 10, //token 过期时间
            "data" => [           //记录的userid的信息,这里是自已添加上去的,如果有其它信息,可以再添加数组的键值对
                'uid' => $uid,
            ]
        );
        $jwt = JWT::encode($token, $key, "HS256");  //根据参数生成了 token
        return $jwt;
    }

    //验证token
    function checkToken($token)
    {
        $key = '!@#$%*&';
        $status = array("code" => 2);
        try {
            JWT::$leeway = 60; //当前时间减去60,把时间留点余地
            $decoded = JWT::decode($token, $key, array('HS256')); //HS256方式,这里要和签发的时候对应
            $arr = (array)$decoded;
            $res['code'] = 1;
            $res['data'] = $arr['data'];
            return $res;
        } catch (\Firebase\JWT\SignatureInvalidException $e) { //签名不正确
            $status['msg'] = "签名不正确";
            return $status;
        } catch (\Firebase\JWT\BeforeValidException $e) { // 签名在某个时间点之后才能用
            $status['msg'] = "token失效";
            return $status;
        } catch (\Firebase\JWT\ExpiredException $e) { // token过期
            $status['msg'] = "token失效";
            return $status;
        } catch (Exception $e) { //其他错误
            $status['msg'] = "未知错误";
            return $status;
        }
    }
}

然后再需要的地方引入

$Token = new Token(); // 实例
$token = $Token->signToken($uid); // 调用方法


评论