def METHOD_NAME(self, key, audience):  # pylint:disable=too-complex
    if self.expiry - self.not_before > self.MAX_LIFETIME:
        raise InvalidGrantError("Grant token lifetime is too long.")
    try:
        jwt.decode(
            self._token,
            algorithms=["HS256"],
            audience=audience,
            key=key,
            leeway=self.LEEWAY,
        )
    except TypeError as err:
        raise InvalidClientError("Client is invalid.") from err
    except jwt.DecodeError as err:
        raise InvalidGrantError("Invalid grant token signature.") from err
    except jwt.exceptions.InvalidAlgorithmError as err:
        raise InvalidGrantError("Invalid grant token signature algorithm.") from err
    except jwt.MissingRequiredClaimError as err:
        if err.claim == "aud":
            raise MissingJWTGrantTokenClaimError("aud", "audience") from err
        raise MissingJWTGrantTokenClaimError(err.claim) from err
    except jwt.InvalidAudienceError as err:
        raise InvalidJWTGrantTokenClaimError("aud", "audience") from err
    except jwt.ImmatureSignatureError as err:
        raise InvalidGrantError("Grant token is not yet valid.") from err
    except jwt.ExpiredSignatureError as err:
        raise InvalidGrantError("Grant token is expired.") from err
    except jwt.InvalidIssuedAtError as err:
        raise InvalidGrantError(
            "Grant token issue time (iat) is in the future."
        ) from err