[Twisted-Python] Returning Failure when requestAvatarID to indicate a failed login is not working for me

Thomas Westfeld thomas.westfeld at currenta.de
Wed Jun 5 05:52:56 MDT 2019


Dear all,

I am experiencing a problem with a custom credential checker for twisted cred based on an external server.

    @defer.inlineCallbacks
    def requestAvatarId(self, credentials):
        user = <query external server with credentials>
        try:
            # Check password with external server, raises InvalidCredentials error
	# if successful return user entry
	user_entry = yield checkCredentialsWithExternalServer(user, credentials.password)
            defer.returnValue(user_entry)
        except InvalidCredentials:
            self.log.debug("Invalid password for username {user}", user=user_entry.dn.getText())
            defer.returnValue(Failure(error.UnauthorizedLogin("username/password is wrong")))

My problem is, that the Failure in the last line does not trigger the Errback of the deferred of the calling method to signal that the login failed.

I also tried to raise the error but this does not work for me. I also tried to return a defer.fail(error.UnauthorizedLogin()).

This is what the requestAvatarID method documentation (https://github.com/twisted/twisted/blob/f9e12bd88618682f7cdba342fbaea1212073533f/src/twisted/cred/checkers.py#L26) says about the return value

        @return: a Deferred which will fire a string which identifies an
        avatar, an empty tuple to specify an authenticated anonymous user
        (provided as checkers.ANONYMOUS) or fire a Failure(UnauthorizedLogin).
        Alternatively, return the result itself.

I am now a bit puzzled that it could be problematic, because the @inlineCallbacks decorator makes the function itself return a deferred already. It would be great to have an inlineCallbacked method as getAvatarID method, because I am doing some networking calls in it which are all returning deferreds.

Do I have to rewrite the getAvatarID implementation to not use inlineCallbacks?

Any help is appreciated,
Thomas


More information about the Twisted-Python mailing list