<?php

declare(strict_types=1);

namespace app\utils;

use \Firebase\JWT\JWT;

/**
 * PHP实现jwt
 */
class JWTUtils extends JWT
{
    //使用HMAC生成信息摘要时所使用的密钥
    private static $key = 'bf731bcb3f5e52ec1b8b12c95f503d7a';

    /**
     * 获取jwt token
     * @param array $payload jwt载荷   格式如下非必须
     * [
     *  'iss'=>'jwt_admin',  //该JWT的签发者
     *  'iat'=>time(),  //签发时间
     *  'exp'=>time()+7200,  //过期时间
     *  'nbf'=>time()+60,  //该时间之前不接收处理该Token
     *  'sub'=>'www.admin.com',  //面向的用户
     *  'jti'=>md5(uniqid('JWT').time())  //该Token唯一标识
     * ]
     * @return bool|string
     */
    public static function getToken(array $payload)
    {
        if (is_array($payload)) {
            $token = self::encode($payload, self::$key);

            return $token;
        } else {
            return false;
        }
    }

    /**
     * 验证token是否有效,默认验证exp,nbf,iat时间
     * @param string $Token 需要验证的token
     * @return bool|string
     */
    public static function verifyToken(string $Token)
    {
        try {
            self::$leeway = 60;
            $decoded = self::decode($Token, self::$key, ['HS256']);
            $arr = (array)$decoded;
            if ($arr['exp'] < time()) {
                throw new RRException("认证信息已过期, 请重新登录.", 401);
            }
            return true;
        } catch(\Exception $e) {
            throw new RRException($e->getMessage(), 401);
        }
    }
}