Всем здравствуйте. В этом блоге я объясняю, как выполнить аутентификацию JWT (вход и регистрация) с помощью Django REST Framework. Давайте начнем.

В моем предыдущем блоге я объяснил, что такое JWT и как его инициализировать с помощью Django. Чтобы узнать об этом, посетите этот блог .

1. Создание приложения Django и установка Django REST Framework

Итак, теперь давайте создадим простой проект Django. Я создаю проект django с именем jwtauthloginandregister. После его создания я просто выполняю миграцию, чтобы внести изменения в нашу модель в базе данных.

$ django-admin startproject jwtauthloginandregister
$ python3 manage.py migrate
$ python3 manage.py runserver

Теперь давайте установим django rest framework и django rest JWT.

$ pip3 install djangorestframework markdown django-filter djangorestframework_simplejwt

После установки не забудьте добавить их в раздел Установленные.

jwtauthloginandregister/settings.py

# Application definition
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'rest_framework', # Add this line
]

Также добавьте класс аутентификации по умолчанию как JWTAuthentication.

jwtauthloginandregister/settings.py

REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': [
        'rest_framework_simplejwt.authentication.JWTAuthentication',
     ],
}

Настройка JWT завершена, но сейчас мы не можем использовать ее, потому что не вызывали ее в urls.py файле уровня проекта. Давай сделаем это.

jwtauthloginandregister/sestting.py

from django.conf.urls import url
from django.contrib import admin
from django.urls import path
from rest_framework_simplejwt import views as jwt_views
urlpatterns = [
    url(r'^admin/', admin.site.urls),
    path('api/token/', jwt_views.TokenObtainPairView.as_view(), name='token_obtain_pair'),
    path('api/token/refresh/', jwt_views.TokenRefreshView.as_view(), name='token_refresh'),
]

2. Создайте приложение для аутентификации.

Django JWT предоставляет нам API входа по умолчанию. Но он не предоставляет нам API для регистрации. Приходится делать это вручную. Для этого я создаю новое приложение account в нашем проекте.

$ python3 manage.py startapp account

Как обычно, после создания приложения я регистрирую его в разделе «Установленные приложения».

jwtauthloginandregister/settings.py

# Application definition
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'rest_framework',
    'account', # Add this line
]

Теперь создайте новый файл в приложении account и просто включите URL-адрес в urls.py файл уровня проекта.

jwtauthloginandregister/urls.py

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    path('api/token/', jwt_views.TokenObtainPairView.as_view(), name='token_obtain_pair'),
    path('api/token/refresh/', jwt_views.TokenRefreshView.as_view(),
name='token_refresh'),
    path('account/', include('account.urls')),
]

Теперь мы успешно настроили наше приложение. Теперь приступим к созданию нашего API регистрации.

3. Создайте просмотры аутентификации.

Для этого я создаю два файла api.py и serializer.py, где api.py - первая точка контакта из urls.py файла.

account/api.py

from rest_framework import generics, permissions, mixins
from rest_framework.response import Response
from .serializer import RegisterSerializer, UserSerializer
from django.contrib.auth.models import User
#Register API
class RegisterApi(generics.GenericAPIView):
    serializer_class = RegisterSerializer
    def post(self, request, *args,  **kwargs):
        serializer = self.get_serializer(data=request.data)
        serializer.is_valid(raise_exception=True)
        user = serializer.save()
        return Response({
            "user": UserSerializer(user,    context=self.get_serializer_context()).data,
            "message": "User Created Successfully.  Now perform Login to get your token",
        })

В serializer.py RegisterSerializer обрабатывает регистрацию пользователей. UserSerializer используется для получения определенных значений пользователей.

account/serializer.py

from rest_framework import  serializers
from rest_framework.permissions import IsAuthenticated
from django.db import models
from django.contrib.auth.models import User
from django.contrib.auth import authenticate
from django.contrib.auth.hashers import make_password
# Register serializer
class RegisterSerializer(serializers.ModelSerializer):
    class Meta:
        model = User
        fields = ('id','username','password','first_name', 'last_name')
        extra_kwargs = {
            'password':{'write_only': True},
        }
     def create(self, validated_data):
        user = User.objects.create_user(validated_data['username'],     password = validated_data['password']  ,first_name=validated_data['first_name'],  last_name=validated_data['last_name'])
        return user
# User serializer
class UserSerializer(serializers.ModelSerializer):
    class Meta:
        model = User
        fields = '__all__'

После создания этих классов просто сопоставьте конечную точку api с urls.py нашего вновь созданного приложения.

account/urls.py

from django.conf.urls import url
from django.urls import path, include
from .api import RegisterApi
urlpatterns = [
      path('api/register', RegisterApi.as_view()),
]

После создания откройте свой почтальон и отправьте запрос на http: // localhost: 8000 / account / api / register

Теперь после регистрации просто войдите, чтобы получить токен JWT. Теперь вы можете сделать запрос на сервер с этим токеном. Для входа отправьте запрос на http: // localhost: 8000 / api / token /

JWT также обрабатывает ошибки входа в систему.

Если вы хотите узнать об основах аутентификации JWT, посетите мой предыдущий блог.

В моем следующем блоге я продемонстрирую, как использовать разрешения и анализировать вложенный JSON.

Не стесняйтесь обращаться ко мне по любым вопросам. Электронная почта: [email protected]. Linkedin: https://www.linkedin.com/in/sjlouji/

Полный код можно найти на моем Github: https://github.com/sjlouji/Medium-Django-Rest-Framework-JWT-auth-login-register.git

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