PHP利用JWT实现token和refresh_token


那么,Refresh Token 是什么呢?一个 Refresh Token 可以是任何东西,从字符串到 Guid 到任意组合,只要它是唯一的。
在 OAuth2 中 RefreshToken 和 AccessToken 是成对的,在后端互相可以找到对方,如果你系统不是这么设计的那本身就有问题。

视频地址

https://www.bilibili.com/video/BV12g411A7hu

 引入
composer require firebase/php-jwt

require __DIR__ . '/vendor/autoload.php';
use Firebase\JWT\JWT;
  1. 生成token
public function getToken()
{
    $key = 'key';  // key
    $time = time();  // 当前时间
    $token = [
        'iss' => 'http://www.buddha.com',  // 签发者 可选
        'aud' => 'http://www.buddha.com',  // 接收该JWT的一方,可选
        'iat' => $time,  // 签发时间
        'nbf' => $time ,  // (Not Before):某个时间点后才能访问,比如设置time+30,表示当前时间30秒后才能使用
        'exp' => $time + 7200,  // 过期时间,这里设置2个小时
        'data' => [  // 自定义信息,不要定义敏感信息
            'id' => 1,
            'username' => 'buddha'
        ]
    ];
    return JWT::encode($token, $key);  // 输出Token
}
  1. 验证token
public function verification()
{
    $key = 'key';  // key要和签发的时候一样
    $jwt = "";  // 签发的Token
    try {
        JWT::$leeway = 60;  // 当前时间减去60,把时间留点余地
        $decoded = JWT::decode($jwt, $key, ['HS256']);  // HS256方式,这里要和签发的时候对应
        $arr = (array)$decoded;
        return $arr;
    } catch(\Firebase\JWT\SignatureInvalidException $e) {  // 签名不正确
        echo $e->getMessage();
    }catch(\Firebase\JWT\BeforeValidException $e) {  // 签名在某个时间点之后才能用
        echo $e->getMessage();
    }catch(\Firebase\JWT\ExpiredException $e) {  // token过期
        echo $e->getMessage();
    }catch(Exception $e) {  // 其他错误
        echo $e->getMessage();
    }
    // Firebase定义了多个throw new,我们可以捕获多个catch来定义问题,catch加入自己的业务
    // 比如token过期可以用当前Token刷新一个新Token
}
  1. 同时生成token和refresh_token
public function authorizations()
{
    $key = 'ffdsfsd@4_45';  // key
    $time = time();  // 当前时间

    // 自定义信息
    $token = [
        'iss' => 'http://www.buddha.com',  // 签发者 可选
        'iat' => $time,  // 签发时间
        'data' => [  // 自定义信息,不要定义敏感信息
            'id' => 1,
            'username' => 'buddha'
        ]
    ];

    $access_token = $token;
    $access_token['scopes'] = 'role_access';  // token标识,请求接口的token
    $access_token['exp'] = $time + 7200;  // access_token过期时间,这里设置2个小时

    $refresh_token = $token;
    $refresh_token['scopes'] = 'role_refresh';  // token标识,刷新access_token
    $refresh_token['exp'] = $time + (86400 * 30);  // access_token过期时间,这里设置30天

    $jsonList = [
        'access_token' => JWT::encode($access_token, $key),
        'refresh_token' => JWT::encode($refresh_token, $key),
        'token_type' => 'bearer'  // token_type:表示令牌类型,该值大小写不敏感,这里用bearer
    ];
    // header("HTTP/1.1 201 Created");
    return json_encode($jsonList);  // 返回给客户端token信息
}

相关