def _gdk_resolve(self, auth_handler): # Processes and handles the state of calls that need authentication. # The authentication process works as a state machine and may require # input to progress. This example only uses email as a authentication # method. If you would like to user other methods such as sms, phone, # gauth or a hardware device see: # https://github.com/Blockstream/green_cli/blob/842697b1c6e382487a2e00606c17d6637fe62e7b/green_cli/green.py#L75 while True: status = gdk.auth_handler_get_status(auth_handler) status = json.loads(status) state = status['status'] if state == 'error': raise RuntimeError( f'\nAn error occurred authenticating the call: {status}') if state == 'done': print('\nAuthentication succeeded or not required\n') return status['result'] if state == 'request_code': authentication_factor = 'email' print(f'\nCode requested via {authentication_factor}.') gdk.auth_handler_request_code(auth_handler, authentication_factor) elif state == 'resolve_code': resolution = input( '\nPlease enter the authentication code you received: ') gdk.auth_handler_resolve_code(auth_handler, resolution) elif state == 'call': gdk.auth_handler_call(auth_handler)
def _gdk_resolve(auth_handler): """Resolve a GA_auth_handler GA_auth_handler instances are returned by some gdk functions. They represent a state machine that drives the process of interacting with the user for two factor authentication or authentication using some external (hardware) device. """ while True: status = gdk.auth_handler_get_status(auth_handler) status = json.loads(status) logging.debug('auth handler status = %s', status) state = status['status'] logging.debug('auth handler state = %s', state) if state == 'error': raise RuntimeError(status) if state == 'done': logging.debug('auth handler returning done') return status['result'] if state == 'request_code': # request_code only applies to 2fa requests authentication_factor = context.twofac_resolver.select_auth_factor( status['methods']) logging.debug('requesting code for %s', authentication_factor) gdk.auth_handler_request_code(auth_handler, authentication_factor) elif state == 'resolve_code': # resolve_code covers two different cases: a request for authentication data from some # kind of authentication device, for example a hardware wallet (but could be some # software implementation) or a 2fa request if status['device']: logging.debug( 'resolving auth handler with authentication device') resolution = context.authenticator.resolve(status) else: logging.debug('resolving two factor authentication') resolution = context.twofac_resolver.resolve(status) logging.debug('auth handler resolved: %s', resolution) gdk.auth_handler_resolve_code(auth_handler, resolution) elif state == 'call': gdk.auth_handler_call(auth_handler)