code: def decode_jwt_token(token, secret):
      
      try:
          # check signature of the token
          decoded_token = jwt.decode(
              token,
              key=secret.encode(),
              verify=True,
              algorithms=[__algorithm__],
              leeway=__bound__
          )
          # token has all the required fields
          if 'iss' not in decoded_token:
              raise TokenIssuerError
          if 'iat' not in decoded_token:
              raise TokenIssuedAtError
  
          # check iat time is within bounds
          now = epoch_seconds()
          iat = int(decoded_token['iat'])
          if now > (iat + __bound__):
              raise TokenExpiredError("Token has expired", decoded_token)
          if iat > (now + __bound__):
              raise TokenExpiredError("Token can not be in the future", decoded_token)
  
          return True
      except jwt.InvalidIssuedAtError:
          raise TokenExpiredError("Token has invalid iat field", decode_token(token))
      except jwt.DecodeError:
          raise TokenDecodeError
docs: Validates and decodes the JWT token
      Token checked for
          - signature of JWT token
          - token issued date is valid
  
      :param token: jwt token
      :param secret: client specific secret
      :return boolean: True if valid token, False otherwise
      :raises TokenIssuerError: if iss field not present
      :raises TokenIssuedAtError: if iat field not present
      :raises jwt.DecodeError: If signature validation fails