Для реализации двухфакторной аутентификации (OTP) в Django вы можете использовать пакет django-otp. Django-otp предоставляет инструменты для добавления OTP-функциональности в ваш проект Django.
Вот пошаговая инструкция, как реализовать django-otp в вашем проекте:
Шаг 1: Установите django-otp
Выполните команду pip install django-otp
в терминале вашего виртуального окружения, чтобы установить пакет django-otp.
Шаг 2: Добавьте django-otp в INSTALLED_APPS
Откройте файл settings.py
вашего Django проекта и добавьте 'django_otp' и 'django_otp.plugins.otp_totp' в список INSTALLED_APPS:
INSTALLED_APPS = [ ... 'django_otp', 'django_otp.plugins.otp_totp', ... ]
Шаг 3: Миграции базы данных
Выполните команду python manage.py makemigrations
и python manage.py migrate
, чтобы создать необходимые таблицы для django-otp в базе данных.
Шаг 4: Настройте AUTHENTICATION_BACKENDS
В файле settings.py
добавьте 'django_otp.backends.OTPBackend'
в список AUTHENTICATION_BACKENDS:
AUTHENTICATION_BACKENDS = [ 'django_otp.backends.OTPBackend', 'django.contrib.auth.backends.ModelBackend', ]
Шаг 5: Расширьте модель пользователя
Если вы уже определили модель пользователя в своем Django проекте, вы должны ее расширить, чтобы добавить поле для хранения OTP-секрета. В файле с вашей моделью пользователя добавьте следующий код:
from django.contrib.auth.models import AbstractUser from django_otp.models import Device class CustomUser(AbstractUser): otp_device = Device
Шаг 6: Создайте представления и маршруты
Создайте представления для регистрации и входа пользователя с использованием OTP. В вашем файле views.py
должны быть определены представления, например:
from django.contrib.auth import login, authenticate from django.contrib.auth.decorators import login_required from django.http import HttpResponseRedirect from django.shortcuts import render from django.urls import reverse def user_login(request): if request.method == 'POST': username = request.POST['username'] password = request.POST['password'] otp_token = request.POST['otp_token'] user = authenticate(request, username=username, password=password, otp_token=otp_token) if user is not None: if user.is_active: login(request, user) return HttpResponseRedirect(reverse('home')) else: return render(request, 'login.html', {'error_message': 'Account is disabled.'}) else: return render(request, 'login.html', {'error_message': 'Invalid login.'}) return render(request, 'login.html') @login_required def home(request): return render(request, 'home.html') def user_logout(request): logout(request) return HttpResponseRedirect(reverse('login'))
Затем создайте маршруты для представлений в файле urls.py
:
from django.urls import path from . import views urlpatterns = [ path('login/', views.user_login, name='login'), path('home/', views.home, name='home'), path('logout/', views.user_logout, name='logout'), ]
Шаг 7: Создайте шаблоны
Создайте шаблоны HTML для ваших представлений и положите их в папку templates
.
Шаг 8: Настройте шаблон для OTP
Для использования OTP вы должны настроить django-otp
в вашем проекте. В вашем файле settings.py
добавьте следующий код:
OTP_TOTP_ISSUER = 'YourAppName' OTP_TOTP_LEEWAY = 1 AUTH_USER_MODEL = 'yourapp.CustomUser'
Шаг 9: Зарегистрируйте устройство OTP для пользователя
В вашем представлении для регистрации пользователя, вы должны зарегистрировать устройство OTP для пользователя:
from django_otp import devices_for_user user = request.user devices = devices_for_user(user) if len(devices) == 0: device = user.otp_device.create(name='default') else: device = devices[0]
В вашем шаблоне для представления регистрации добавьте поле для ввода OTP-токена:
<form method="post" action="{% url 'login' %}"> {% csrf_token %} ... <input type="text" name="otp_token" placeholder="OTP Token" required> ... </form>
Шаг 10: Защитите ваши представления с помощью двухфакторной аутентификации
Для защиты ваших представлений от неавторизованного доступа вы можете добавить декоратор @login_required
:
from django.contrib.auth.decorators import login_required @login_required def home(request): return render(request, 'home.html')
Теперь пользователю будет требоваться ввод OTP-токена на странице входа и на странице home для доступа к этим представлениям.
Вот, вы только что добавили двухфакторную аутентификацию в Django с помощью django-otp. Если вы следовали всем шагам, то теперь в вашем Django проекте будет включена OTP-аутентификация.