Base Backends¶
BaseMessageOTPBackend
¶
Bases: BaseOTPBackend
Base class for message-based OTP backends.
This class extends BaseOTPBackend and provides methods specific to message-based OTPs.
Source code in drf_2fa/backends/__init__.py
class BaseMessageOTPBackend(BaseOTPBackend):
"""
Base class for message-based OTP backends.
This class extends `BaseOTPBackend` and provides methods specific to message-based OTPs.
"""
template_name = "drf_2fa/sms/message.txt"
def get_context_data(self):
"""Get the context data for rendering the message template."""
return {}
def get_message_content(self):
"""Get the message content."""
context = self.get_context_data()
return render_to_string(self.template_name, context=context)
def verify_otp(self, user, otp):
"""Verify the OTP code."""
is_valid, otp_obj = OTPCode.is_valid(user, otp)
if is_valid:
otp_obj.delete() # delete otp from the database, since it's already used and verified
return is_valid
def save_otp(self, user):
"""Save the OTP in the database."""
otp_code = self.generate_otp()
# save the otp to database
OTPCode.objects.create(user=user, otp_code=otp_code)
return otp_code
def save_and_send_otp_code(self, user):
"""Save and send the OTP code to the user"""
self.save_otp(user)
self.send_otp(user)
get_context_data()
¶
Get the context data for rendering the message template.
Source code in drf_2fa/backends/__init__.py
def get_context_data(self):
"""Get the context data for rendering the message template."""
return {}
get_message_content()
¶
Get the message content.
Source code in drf_2fa/backends/__init__.py
def get_message_content(self):
"""Get the message content."""
context = self.get_context_data()
return render_to_string(self.template_name, context=context)
save_and_send_otp_code(user)
¶
Save and send the OTP code to the user
Source code in drf_2fa/backends/__init__.py
def save_and_send_otp_code(self, user):
"""Save and send the OTP code to the user"""
self.save_otp(user)
self.send_otp(user)
save_otp(user)
¶
Save the OTP in the database.
Source code in drf_2fa/backends/__init__.py
def save_otp(self, user):
"""Save the OTP in the database."""
otp_code = self.generate_otp()
# save the otp to database
OTPCode.objects.create(user=user, otp_code=otp_code)
return otp_code
verify_otp(user, otp)
¶
Verify the OTP code.
Source code in drf_2fa/backends/__init__.py
def verify_otp(self, user, otp):
"""Verify the OTP code."""
is_valid, otp_obj = OTPCode.is_valid(user, otp)
if is_valid:
otp_obj.delete() # delete otp from the database, since it's already used and verified
return is_valid
BaseOTPBackend
¶
Base class for OTP backends.
This class defines the interface for OTP backends and provides common methods that must be implemented by subclasses.
Subclasses must implement the following methods
verify_otp(user, otp)save_otp(user)send_otp(user)save_and_send_otp_code(user)
Source code in drf_2fa/backends/__init__.py
class BaseOTPBackend:
"""
Base class for OTP backends.
This class defines the interface for OTP backends and provides common methods
that must be implemented by subclasses.
Subclasses must implement the following methods:
- `verify_otp(user, otp)`
- `save_otp(user)`
- `send_otp(user)`
- `save_and_send_otp_code(user)`
"""
def __init__(self):
self.settings = self.get_settings()
self.otp_code = None
def get_settings(self):
"""Get DRF 2FA settings."""
return drf_2fa_settings
def generate_otp(self):
"""Generate a random OTP code."""
if getattr(self, 'otp_code'):
return self.otp_code
else:
self.otp_code = ''.join(random.choices(string.digits, k=drf_2fa_settings.OTP_LENGTH))
return self.otp_code
def verify_otp(self, user, otp):
"""Verify the OTP code."""
raise NotImplementedError(f"`{self.__class__.__name__}` backend must override `verify_otp` method")
def save_otp(self, user):
"""store the OTP in database if required"""
raise NotImplementedError(f"`{self.__class__.__name__}` backend must override `save_otp` method")
def send_otp(self, user):
"""Send the OTP to the user."""
raise NotImplementedError(f"`{self.__class__.__name__}` backend must override `send_otp` method")
def save_and_send_otp_code(self, user):
"""Save and send the OTP code."""
raise NotImplementedError(f"`{self.__class__.__name__}` backend must override `save_and_send_otp_code` method")
generate_otp()
¶
Generate a random OTP code.
Source code in drf_2fa/backends/__init__.py
def generate_otp(self):
"""Generate a random OTP code."""
if getattr(self, 'otp_code'):
return self.otp_code
else:
self.otp_code = ''.join(random.choices(string.digits, k=drf_2fa_settings.OTP_LENGTH))
return self.otp_code
get_settings()
¶
Get DRF 2FA settings.
Source code in drf_2fa/backends/__init__.py
def get_settings(self):
"""Get DRF 2FA settings."""
return drf_2fa_settings
save_and_send_otp_code(user)
¶
Save and send the OTP code.
Source code in drf_2fa/backends/__init__.py
def save_and_send_otp_code(self, user):
"""Save and send the OTP code."""
raise NotImplementedError(f"`{self.__class__.__name__}` backend must override `save_and_send_otp_code` method")
save_otp(user)
¶
store the OTP in database if required
Source code in drf_2fa/backends/__init__.py
def save_otp(self, user):
"""store the OTP in database if required"""
raise NotImplementedError(f"`{self.__class__.__name__}` backend must override `save_otp` method")
send_otp(user)
¶
Send the OTP to the user.
Source code in drf_2fa/backends/__init__.py
def send_otp(self, user):
"""Send the OTP to the user."""
raise NotImplementedError(f"`{self.__class__.__name__}` backend must override `send_otp` method")
verify_otp(user, otp)
¶
Verify the OTP code.
Source code in drf_2fa/backends/__init__.py
def verify_otp(self, user, otp):
"""Verify the OTP code."""
raise NotImplementedError(f"`{self.__class__.__name__}` backend must override `verify_otp` method")
SMSOTPBackend
¶
Bases: BaseMessageOTPBackend
Base class for sms-based OTP backends.
This class extends BaseMessageOTPBackend and provides methods specific to sms-based OTPs.
Source code in drf_2fa/backends/__init__.py
class SMSOTPBackend(BaseMessageOTPBackend):
"""
Base class for sms-based OTP backends.
This class extends `BaseMessageOTPBackend` and provides methods specific to sms-based OTPs.
"""
pass