class BaseOTPProvider: '''OTP providers must be subclasses of BaseOTPProvider and implement at least validate_token().''' @property def get_name(self): return "Base OTP Provider" @property def get_logo(self): return "" def __str__(self): return self.get_name @property def is_active(self): '''Returns True if the provider is properly configured and ready to use.''' raise NotImplementedError(f"{type(self)} does not implement is_active!") def active_for_user(self, user): '''Returns True if the provider is active and ready to be used by user.''' return self.is_active def start_authentication(self, user): return "Authentication started, please enter your 2FA token." def validate_token(self, user, token): raise NotImplementedError(f"{type(self)} does not implement validate_token()!")