Вы создаете API с Django Rest Framework и вам нужно добавить аутентификацию, чтобы только авторизованные пользователи могли получить доступ к вашим данным? Не ищите дальше dj-rest-auth! В этой статье мы рассмотрим, как реализовать аутентификацию в Django Rest Framework API с помощью dj-rest-auth и с легкостью защитить ваш API.

🔍 Шаг 1: Установка
Для начала установим необходимые пакеты:
pip install dj-rest-auth django-allauth djangorestframework
🔍 Шаг 2. Настройка
Далее нам нужно настроить наш проект для использования dj-rest-auth и django-allauth. Откройте файл settings.py вашего проекта и добавьте следующие строки:
INSTALLED_APPS = [
# ...
'django.contrib.sites',
'allauth',
'allauth.account',
'dj_rest_auth',
'dj_rest_auth.registration',
# ...
]
SITE_ID = 1
AUTHENTICATION_BACKENDS = [
'django.contrib.auth.backends.ModelBackend',
'allauth.account.auth_backends.AuthenticationBackend',
]
В приведенном выше коде мы добавляем django-allauth, dj-rest-auth и их соответствующие зависимости в список INSTALLED_APPS. Мы также добавляем django.contrib.sites и устанавливаем SITE_ID на 1. Наконец, мы добавляем AuthenticationBackend в список AUTHENTICATION_BACKENDS, чтобы включить аутентификацию.
🔍 Шаг 3. Создание классов аутентификации
Далее давайте создадим пользовательские классы аутентификации в файле views.py вашего проекта:
from dj_rest_auth.views import LoginView, LogoutView, PasswordChangeView
from dj_rest_auth.registration.views import RegisterView
from rest_framework import generics
from rest_framework.permissions import AllowAny
from .serializers import MyCustomUserDetailsSerializer
class MyCustomLoginView(LoginView):
permission_classes = (AllowAny,)
class MyCustomRegisterView(RegisterView):
serializer_class = MyCustomUserDetailsSerializer
class MyCustomUserDetailsView(generics.RetrieveUpdateAPIView):
serializer_class = MyCustomUserDetailsSerializer
def get_object(self):
return self.request.user
В приведенном выше коде мы создаем пользовательские классы аутентификации для обработки функций входа, выхода и смены пароля пользователя. Мы также создаем настраиваемое представление регистрации для обработки регистрации пользователей с помощью настраиваемого сериализатора сведений о пользователе. Наконец, мы создаем настраиваемое представление сведений о пользователе, чтобы пользователи, прошедшие проверку подлинности, могли получать и обновлять свои сведения о пользователе.
🔍 Шаг 4. Создание представлений аутентификации и регистрации пользователей
Давайте создадим представления аутентификации и регистрации пользователей, расширив классы аутентификации, которые мы только что создали. Откройте файл views.py вашего проекта и добавьте следующий код:
from dj_rest_auth.views import PasswordResetConfirmView
from dj_rest_auth.registration.views import VerifyEmailView
class MyCustomVerifyEmailView(VerifyEmailView):
permission_classes = (AllowAny,)
def get(self, request, *args, **kwargs):
response = super().get(request, *args, **kwargs)
response.data['message'] = 'Success'
return response
class MyCustomPasswordResetConfirmView(PasswordResetConfirmView):
permission_classes = (AllowAny,)
В приведенном выше коде мы расширяем классы VerifyEmailView и PasswordResetConfirmView для обработки проверки электронной почты и функции сброса пароля.
🔍 Шаг 5. Создание шаблонов URL
Чтобы создать шаблоны URL для представлений аутентификации, откройте файл urls.py вашего проекта и добавьте следующий код:
from django.urls import path, include
from .views import (MyCustomLoginView, MyCustomRegisterView, MyCustomUserDetailsView,
MyCustomVerifyEmailView, MyCustomPasswordResetConfirmView)
urlpatterns = [
# ...
path('api-auth/', include('rest_framework.urls')),
path('api/rest-auth/', include('dj_rest_auth.urls')),
path('api/rest-auth/registration/', include('dj_rest_auth.registration.urls')),
path('api/rest-auth/login/', MyCustomLoginView.as_view(), name='login'),
path('api/rest-auth/logout/', LogoutView.as_view(), name='logout'),
path('api/rest-auth/password/change/', PasswordChangeView.as_view(), name='password_change'),
path('api/rest-auth/register/', MyCustomRegisterView.as_view(), name='register'),
path('api/rest-auth/user/', MyCustomUserDetailsView.as_view(), name='user_details'),
path('api/rest-auth/registration/account-confirm-email/<str:key>/', MyCustomVerifyEmailView.as_view(), name='account_confirm_email'),
path('api/rest-auth/password/reset/confirm/<slug:uidb64>/<slug:token>/', MyCustomPasswordResetConfirmView.as_view(), name='password_reset_confirm'),
# ...
]
В приведенном выше коде мы добавляем шаблоны URL для просмотра аутентификации, включая вход в систему, выход из системы, смену пароля, регистрацию, данные пользователя, подтверждение электронной почты и подтверждение сброса пароля. Мы также добавляем rest_framework.urls, чтобы включить представления аутентификации Django Rest Framework по умолчанию.
🔍 Шаг 6. Настройка сериализатора сведений о пользователе
Чтобы настроить сериализатор сведений о пользователе, создайте новый файл с именем serializers.py в каталоге вашего проекта и добавьте следующий код:
from dj_rest_auth.registration.serializers import RegisterSerializer
from dj_rest_auth.serializers import UserDetailsSerializer
class MyCustomUserDetailsSerializer(UserDetailsSerializer):
class Meta:
fields = ('username', 'email', 'first_name', 'last_name')
read_only_fields = ('email',)
class MyCustomRegisterSerializer(RegisterSerializer):
first_name = serializers.CharField(required=True)
last_name = serializers.CharField(required=True)
def get_cleaned_data(self):
cleaned_data = super().get_cleaned_data()
cleaned_data['first_name'] = self.validated_data.get('first_name', '')
cleaned_data['last_name'] = self.validated_data.get('last_name', '')
return cleaned_data
В приведенном выше коде мы создаем пользовательские сериализаторы для сведений о пользователе и регистрации. Мы также добавляем поля в сериализатор сведений о пользователе, чтобы включать имя и фамилию.
🚀 Вот оно! Вы успешно реализовали аутентификацию в Django Rest Framework, используя dj-rest-auth. Теперь только авторизованные пользователи могут получить доступ к вашему API, что обеспечит безопасность ваших данных.
👩💻 Удачного кодирования!