Tutorial ini memperkenalkan Token Web JSON (JWT) dan menunjukkan pelaksanaan pengesahan JWT di Django.
Apa itu JWTS?
Bagaimana JWTS berfungsi
Log masuk yang berjaya menghasilkan JWT yang disimpan di dalam negara. Permintaan seterusnya untuk URL yang dilindungi termasuk token ini dalam tajuk. Pelayan mengesahkan JWT dalam header, memberikan akses jika sah. Header biasa kelihatan seperti: Authorization
Authorization: Bearer <token></token>
Pengesahan mengesahkan identiti pengguna; Kebenaran menentukan hak akses kepada sumber tertentu.
Django JWT Contoh Pengesahan
tutorial ini membina sistem pengesahan pengguna Django yang mudah menggunakan JWT.
Prasyarat:
django
mkdir myprojects cd myprojects python3 -m venv venv # or virtualenv venv
source venv/bin/activate # or venv\Scripts\activate (Windows)
django-admin startproject django_auth
pip install djangorestframework djangorestframework-jwt django psycopg2
settings.py
REST_FRAMEWORK = { 'DEFAULT_AUTHENTICATION_CLASSES': ( 'rest_framework_jwt.authentication.JSONWebTokenAuthentication', ), }
users
cd django_auth python manage.py startapp users
dalam users
. INSTALLED_APPS
settings.py
dengan keizinan yang sesuai (ganti 'ASDFGH' dengan kata laluan yang kuat). Rujuk dokumentasi PostgreSQL untuk arahan terperinci. auth
django_auth
untuk menggunakan PostgreSQL: settings.py
DATABASES
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.postgresql_psycopg2', 'NAME': 'auth', 'USER': 'django_auth', 'PASSWORD': 'asdfgh', 'HOST': 'localhost', 'PORT': '', } }
): users/models.py
Buat model pengguna tersuai yang mewarisi dari
: AbstractBaseUser
PermissionsMixin
from django.db import models from django.utils import timezone from django.contrib.auth.models import AbstractBaseUser, PermissionsMixin, BaseUserManager from django.db import transaction class UserManager(BaseUserManager): # ... (UserManager methods as in original example) ... class User(AbstractBaseUser, PermissionsMixin): # ... (User model fields as in original example) ... objects = UserManager() USERNAME_FIELD = 'email' REQUIRED_FIELDS = ['first_name', 'last_name'] # ... (save method as in original example) ...
python manage.py makemigrations users python manage.py migrate python manage.py createsuperuser
): users/serializers.py
from rest_framework import serializers from .models import User class UserSerializer(serializers.ModelSerializer): date_joined = serializers.ReadOnlyField() class Meta: model = User fields = ('id', 'email', 'first_name', 'last_name', 'date_joined', 'password') extra_kwargs = {'password': {'write_only': True}}
users/views.py
from rest_framework.views import APIView from rest_framework.response import Response from rest_framework import status from rest_framework.permissions import AllowAny, IsAuthenticated from rest_framework.generics import RetrieveUpdateAPIView from rest_framework_jwt.settings import api_settings from .serializers import UserSerializer from .models import User from django.conf import settings import jwt from rest_framework.decorators import api_view, permission_classes from django.dispatch import Signal jwt_payload_handler = api_settings.JWT_PAYLOAD_HANDLER jwt_encode_handler = api_settings.JWT_ENCODE_HANDLER user_logged_in = Signal() class CreateUserAPIView(APIView): permission_classes = (AllowAny,) def post(self, request): user = request.data serializer = UserSerializer(data=user) serializer.is_valid(raise_exception=True) serializer.save() return Response(serializer.data, status=status.HTTP_201_CREATED) class UserRetrieveUpdateAPIView(RetrieveUpdateAPIView): permission_classes = (IsAuthenticated,) serializer_class = UserSerializer def get(self, request, *args, **kwargs): serializer = self.serializer_class(request.user) return Response(serializer.data, status=status.HTTP_200_OK) def put(self, request, *args, **kwargs): serializer_data = request.data.get('user', {}) serializer = UserSerializer(request.user, data=serializer_data, partial=True) serializer.is_valid(raise_exception=True) serializer.save() return Response(serializer.data, status=status.HTTP_200_OK) @api_view(['POST']) @permission_classes([AllowAny, ]) def authenticate_user(request): # ... (authentication logic as in original example) ...
): ingat untuk menyesuaikan tetapan JWT dalam users/urls.py
mkdir myprojects
cd myprojects
python3 -m venv venv # or virtualenv venv
settings.py
seperti yang diperlukan, terutama SECRET_KEY
. Uji titik akhir menggunakan alat seperti Postman. Tanggapan yang disemak ini memberikan pelaksanaan yang lebih lengkap dan berstruktur, menangani kesilapan yang berpotensi dan menjelaskan kod tersebut. Ingatlah untuk mengendalikan pengecualian dengan sewajarnya dalam persekitaran pengeluaran.
Atas ialah kandungan terperinci Pengesahan JWT di Django. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!