code: def sign_json(self, keys=None, headers=None, flatten=False):
          
  
          def create_signature(protected, unprotected):
              protected_headers = protected or {}
              # always protect the signing alg header
              protected_headers.setdefault("alg", self.alg)
              _jws = JWS(self.msg, **protected_headers)
              encoded_header, payload, signature = _jws.sign_compact(
                  protected=protected,
                  keys=keys).split(".")
              signature_entry = {"signature": signature}
              if unprotected:
                  signature_entry["header"] = unprotected
              if encoded_header:
                  signature_entry["protected"] = encoded_header
  
              return signature_entry
  
          res = {"payload": b64e_enc_dec(self.msg, "utf-8", "ascii")}
  
          if headers is None:
              headers = [(dict(alg=self.alg), None)]
  
          if flatten and len(
                  headers) == 1:  # Flattened JWS JSON Serialization Syntax
              signature_entry = create_signature(*headers[0])
              res.update(signature_entry)
          else:
              res["signatures"] = []
              for protected, unprotected in headers:
                  signature_entry = create_signature(protected, unprotected)
                  res["signatures"].append(signature_entry)
  
          return json.dumps(res)
docs: Produce JWS using the JWS JSON Serialization
  
          :param keys: list of keys to use for signing the JWS
          :param headers: list of tuples (protected headers, unprotected
              headers) for each signature
          :return: A signed message using the JSON serialization format.