В сучасних веб-додатках забезпечення безпечної аутентифікації користувачів є першочерговим завданням. JSON Web Tokens (JWT) є широко використовуваним рішенням для обробки аутентифікації користувачів. У цьому пості ми розглянемо, як працює JWT для входу та реєстрації користувачів у проекті Django та як реалізувати це безперешкодно. Ви дізнаєтесь про реєстрацію користувачів, вхід і керування токенами за допомогою JWT.
Реєстрація користувачів
Реєстрація користувачів — це процес, під час якого нові користувачі надають свої дані (наприклад, ім’я користувача, електронну пошту та пароль), а сервер створює нового користувача в базі даних. Після реєстрації користувач зможе увійти в систему та отримати токен аутентифікації (JWT).
Під час реєстрації користувач надсилає свої дані, які потім зберігаються безпечно в базі даних. Після успішного створення користувача сервер надсилає відповідь, що підтверджує реєстрацію.
Вхід користувача
Після реєстрації користувачі можуть увійти, використовуючи свої облікові дані (ім’я користувача та пароль). Сервер перевіряє ці дані, і, якщо вони вірні, генерує JWT токен, який повертається клієнту. Цей токен буде використовуватись для аутентифікації користувача під час майбутніх запитів.
Коли користувач входить в систему, сервер перевіряє його облікові дані (ім’я користувача та пароль). Якщо вони вірні, сервер генерує JWT токен, який повертається клієнту. Цей токен повинен бути включений у заголовки наступних запитів для доступу до захищених переглядів, таких як додавання учасників до команди або створення нових ресурсів.
JWT Токен
JWT токен — це безпечний рядок, який кодує ідентичність користувача та будь-які відповідні претензії або інформацію. Клієнт надсилає цей токен з кожним запитом до захищених кінцевих точок, що гарантує, що користувач аутентифікований і авторизований для доступу до цих ресурсів.
JWT токен, після того як він буде виданий клієнту, повинен бути включений у заголовок Authorization
для кожного наступного запиту. Цей заголовок містить токен, який перевіряється сервером. Якщо токен є дійсним, запит авторизується; якщо ні, сервер повертає відповідь 401 Unauthorized.
Оновлення токена
JWT токени мають час дії. Якщо токен користувача закінчився, він може запитати новий токен, надіславши свій токен оновлення до кінцевої точки оновлення. Токен оновлення використовується для створення нового JWT без необхідності повторного входу користувача.
Як це реалізовано в Django
Розглянемо реалізацію аутентифікації JWT в Django. Ми створимо перегляди для реєстрації користувачів, входу та оновлення токенів, а також будемо керувати аутентифікацією JWT за допомогою Django та пакету djangorestframework-simplejwt
.
1. Встановлення необхідних пакетів
Перш за все, встановіть необхідні пакети в вашому проекті Django:
pip install django djangorestframework djangorestframework-simplejwt
2. Оновлення налаштувань Django
У файлі settings.py
додайте rest_framework
та rest_framework_simplejwt
до INSTALLED_APPS
:
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'rest_framework',
'rest_framework_simplejwt',
]
Далі налаштуйте JWT як метод аутентифікації за замовчуванням:
REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES': (
'rest_framework_simplejwt.authentication.JWTAuthentication',
),
}
3. Створення серіалізаторів
У файлі users/serializers.py
створіть серіалізатори для реєстрації користувачів, входу та керування токенами.
from rest_framework import serializers
from django.contrib.auth.models import User
from rest_framework_simplejwt.tokens import RefreshToken
class UserSerializer(serializers.ModelSerializer):
class Meta:
model = User
fields = ['username', 'email', 'password']
extra_kwargs = {'password': {'write_only': True}}
def create(self, validated_data):
user = User.objects.create_user(**validated_data)
return user
class LoginSerializer(serializers.Serializer):
username = serializers.CharField()
password = serializers.CharField()
class TokenSerializer(serializers.Serializer):
refresh = serializers.CharField()
access = serializers.CharField()
4. Створення переглядів
Створіть перегляди для реєстрації користувачів, входу та оновлення токенів у файлі users/views.py
.
from rest_framework_simplejwt.views import TokenObtainPairView, TokenRefreshView
from .serializers import UserSerializer, LoginSerializer, TokenSerializer
from rest_framework import status
from rest_framework.response import Response
from django.contrib.auth import authenticate
class RegisterView(APIView):
def post(self, request):
serializer = UserSerializer(data=request.data)
if serializer.is_valid():
serializer.save()
return Response(serializer.data, status=status.HTTP_201_CREATED)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
class LoginView(TokenObtainPairView):
serializer_class = LoginSerializer
class RefreshTokenView(TokenRefreshView):
serializer_class = TokenSerializer
5. Визначення URL
У файлі users/urls.py
визначте маршрути для реєстрації, входу та оновлення токенів.
from django.urls import path
from .views import RegisterView, LoginView, RefreshTokenView
urlpatterns = [
path('register/', RegisterView.as_view(), name='register'),
path('login/', LoginView.as_view(), name='login'),
path('refresh/', RefreshTokenView.as_view(), name='refresh'),
]
У головному файлі urls.py
додайте URL-адреси користувача:
from django.urls import include, path
urlpatterns = [
path('api/', include('users.urls')),
]
Висновок
Аутентифікація JWT забезпечує безпечний та безстатевий спосіб керування сесіями користувачів.
Слідуючи цьому посібнику, ви зможете реалізувати повнофункціональну систему реєстрації користувачів та входу за допомогою JWT у вашому Django-додатку. Ця конфігурація дозволяє легко здійснювати аутентифікацію користувачів, а також дає можливість оновлювати токени, що робить її масштабованою та безпечною для використання в реальних додатках.
Перекладено з: JWT Authentication for User Login and Registration in Django