def authenticate(self, username, password):
        """Authenticate against the ObjectRocket API.

        :param str username: The username to perform basic authentication against the API with.
        :param str password: The password to perform basic authentication against the API with.
        :returns: A token used for authentication against token protected resources.
        :rtype: str
        """
        # Update the username and password bound to this instance for re-authentication needs.
        self._username = username
        self._password = password

        # Attempt to authenticate.
        resp = requests.get(
            self._url,
            auth=(username, password),
            **self._default_request_kwargs
        )

        # Attempt to extract authentication data.
        try:
            if resp.status_code == 200:
                json_data = resp.json()
                token = json_data['data']['token']
            elif resp.status_code == 401:
                raise errors.AuthFailure(resp.json().get('message', 'Authentication Failure.'))
            else:
                raise errors.AuthFailure(
                    "Unknown exception while authenticating: '{}'".format(resp.text)
                )
        except errors.AuthFailure:
            raise
        except Exception as ex:
            logging.exception(ex)
            raise errors.AuthFailure('{}: {}'.format(ex.__class__.__name__, ex))

        # Update the token bound to this instance for use by other client operations layers.
        self._token = token
        logger.info('New API token received: "{}".'.format(token))
        return token
Authenticate against the ObjectRocket API.

        :param str username: The username to perform basic authentication against the API with.
        :param str password: The password to perform basic authentication against the API with.
        :returns: A token used for authentication against token protected resources.
        :rtype: str