<?php

use Firebase\JWT\JWT;
use Firebase\JWT\Key;
use Firebase\JWT\ExpiredException;

include_once(SERVER_ROOT."/model/mBase.php");

class mJwt extends mBase {

    public $alg='HS256';
    public $expire=86400;
    public $iss='';
    public $sub='';
    public $aud='';
    public $jti='';

    private function getJwtKey() {
        return JWT_KEY;
    }

    //         iss: jwt签发者
    //         sub: jwt所面向的用户
    //         aud: 接收jwt的一方
    //         exp: jwt的过期时间,这个过期时间必须要大于签发时间
    //         nbf: 定义在什么时间之前,该jwt都是不可用的.
    //         iat: jwt的签发时间
    //         jti: jwt的唯一身份标识,主要用来作为一次性token,从而回避重放攻击
    public function getJwtEncode($data=array()) {
        include_once(SERVER_ROOT."/vendor/autoload.php");

        $payload = array();
        $payload['iat'] = time();
        $payload['nbf'] = time();
        if ($this->expire) $payload['exp'] = time()+$this->expire;
        if ($this->iss) $payload['iss'] = $this->iss;
        if ($this->sub) $payload['sub'] = $this->sub;
        if ($this->aud) $payload['aud'] = $this->aud;
        if ($this->jti) $payload['jti'] = $this->jti;
        if ($data) $payload = array_merge($payload, $data);

        return JWT::encode($payload, $this->getJwtKey(), $this->alg);
    }

    public function getJwtDecode($jwt) {
        include_once(SERVER_ROOT."/vendor/autoload.php");

        $keyOrKeyArray  = new Key($this->getJwtKey(), $this->alg);

        JWT::$leeway = 60; // $leeway in seconds
        try {
            return (array)JWT::decode($jwt, $keyOrKeyArray);
        } catch (ExpiredException $e) {
            // 当JWT过期时,你可以选择重新登录或者其他逻辑处理
            $this->setError("token过期");
            return false;
        } catch (Exception $e) {
            // 其他JWT相关的异常处理
            $this->setError("token无效");
            return false;
        }
    }
}