Вы создаете 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, что обеспечит безопасность ваших данных.

👩‍💻 Удачного кодирования!