Logs into Brickset as a user, returning a userhash, which can be used in other methods.
        The user hash is stored inside the client (:attr:`userHash`).

        :param str username: Your Brickset username.
        :param str password: Your Brickset password.
        :returns: If the login is valid, this will return ``True``.
        :rtype: `bool`
        :raises: :class:`brickfront.errors.InvalidLoginCredentials`

def login(self, username, password):
        '''
        Logs into Brickset as a user, returning a userhash, which can be used in other methods.
        The user hash is stored inside the client (:attr:`userHash`).

        :param str username: Your Brickset username.
        :param str password: Your Brickset password.
        :returns: If the login is valid, this will return ``True``.
        :rtype: `bool`
        :raises: :class:`brickfront.errors.InvalidLoginCredentials`
        '''

        # Get the site
        url = Client.ENDPOINT.format('login')
        params = {
            'apiKey': self.apiKey,
            'username': username,
            'password': password,
        }
        returned = get(url, params=params)
        self.checkResponse(returned)
        root = ET.fromstring(returned.text)

        # Determine whether they logged in correctly
        if root.text.startswith('ERROR'):
            self.userHash = ''
            raise InvalidLoginCredentials('The provided username and password were unable to authenticate.')
        self.userHash = root.text
        return True