code: def authenticate(self, req_data, key=None):
          
          identifiers = set()
          typ = req_data.get(OPERATION, {}).get(TXN_TYPE)
          if key and self._check_and_verify_existing_req(req_data, key):
              return self._verified_reqs[key]['identifiers']
  
          for authenticator in self._authenticators:
              if authenticator.is_query(typ):
                  return set()
              if not (authenticator.is_write(typ) or
                      authenticator.is_action(typ)):
                  continue
              rv = authenticator.authenticate(deepcopy(req_data)) or set()
              identifiers.update(rv)
  
          if not identifiers:
              raise NoAuthenticatorFound
          if key:
              self._verified_reqs[key] = {'signature': req_data.get(f.SIG.nm)}
              self._verified_reqs[key]['identifiers'] = identifiers
          return identifiers
docs: Authenticates a given request data by verifying signatures from
          any registered authenticators. If the request is a query returns
          immediately, if no registered authenticator can authenticate then an
          exception is raised.
          :param req_data:
          :return: