// +---------------------------------------------------------------------- namespace crmeb\traits; use Firebase\JWT\BeforeValidException; use Firebase\JWT\ExpiredException; use Firebase\JWT\JWT; use Firebase\JWT\SignatureInvalidException; use think\facade\Env; use UnexpectedValueException; trait JwtAuthModelTrait { /** * @param string $type * @param array $params * @return array */ public function getToken(string $type, array $params = []): array { $id = $this->{$this->getPk()}; $host = app()->request->host(); $time = time(); $params += [ 'iss' => $host, 'aud' => $host, 'iat' => $time, 'nbf' => $time, 'exp' => strtotime('+ 3hour'), ]; $params['jti'] = compact('id', 'type'); $token = JWT::encode($params, Env::get('app.app_key', 'default')); return compact('token', 'params'); } /** * @param string $jwt * @return array * * @throws UnexpectedValueException Provided JWT was invalid * @throws SignatureInvalidException Provided JWT was invalid because the signature verification failed * @throws BeforeValidException Provided JWT is trying to be used before it's eligible as defined by 'nbf' * @throws BeforeValidException Provided JWT is trying to be used before it's been created as defined by 'iat' * @throws ExpiredException Provided JWT has since expired, as defined by the 'exp' claim * */ public static function parseToken(string $jwt): array { JWT::$leeway = 60; $data = JWT::decode($jwt, Env::get('app.app_key', 'default'), array('HS256')); $model = new self(); return [$model->where($model->getPk(), $data->jti->id)->find(), $data->jti->type]; } }