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:

def authenticate(self, req_data, key=None):
        """
        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:
        """
        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