Djoser로 인증

11061 단어 djoserdjangojwtpython
Django 인증 시스템의 REST 구현. djoser 라이브러리는 Django Rest Framework 보기 세트를 제공하여 등록, 로그인, 로그아웃, 비밀번호 재설정 및 계정 활성화와 같은 기본 작업을 처리합니다. 사용자 정의 사용자 모델과 함께 작동합니다.

요구 사항:


  • 장고(Rest Framework)

  • MailHog (개발자를 위한 이메일 테스트 도구)
  • Djoser
  • DRF YASG

  • 프로젝트 설정:



    가상 환경을 만듭니다.

    python -m venv env
    
    Activate
    ./env/Scripts/activate # for windows
    
    source env/bin/activate # linux user
    

    여기서는 pip 또는 pienv를 사용할 수 있는 시를 사용하고 있습니다.
    시 설정:

        poetry init
        poetry add django djangorestframework djoser djangorestframework_simplejwt django-cors-headers
        poetry add drf-yasg # for api docs
    

    프로젝트 및 앱 만들기:



        django-admin startproject core
        python manage.py startapp accounts
    

    settings.py 구성:



    # Installed Apps
    
    DJANGO_APPS = [
    "django.contrib.admin",
    "django.contrib.auth",
    "django.contrib.contenttypes",
    "django.contrib.sessions",
    "django.contrib.messages",
    "django.contrib.staticfiles",
    ]
    
    PROJECT_APPS = ["accounts"]
    
    THIRD_PARTY_APPS = [
    "rest_framework",
    "drf_yasg",
    "djoser",
    "corsheaders",
    "rest_framework_simplejwt",
    "rest_framework_simplejwt.token_blacklist",
    ]
    
    INSTALLED_APPS = DJANGO_APPS + PROJECT_APPS + THIRD_PARTY_APPS
    
    MIDDLEWARE = [
    "django.middleware.security.SecurityMiddleware",
    "django.contrib.sessions.middleware.SessionMiddleware",
    "corsheaders.middleware.CorsMiddleware", # middleware for cors-headers
    "django.middleware.common.CommonMiddleware",
    "django.middleware.csrf.CsrfViewMiddleware",
    "django.contrib.auth.middleware.AuthenticationMiddleware",
    "django.contrib.messages.middleware.MessageMiddleware",
    "django.middleware.clickjacking.XFrameOptionsMiddleware",
    ]
    

    맞춤 사용자 모델을 만들어 보겠습니다.



    계정/models.py

    from django.db import models
    from django.contrib.auth.models import (
        AbstractBaseUser,
        PermissionsMixin,
        BaseUserManager,
    )
    
    
    class CustomUserManager(BaseUserManager):
        def create_user(self, email, username, password=None, **extra_fields):
            if not email:
                raise ValueError("User must have an email")
            email = self.normalize_email(email)
            user = self.model(email=email, username=username, **extra_fields)
            user.set_password(password)
            user.save(using=self._db)
            return user
    
        def create_superuser(self, username, email, password=None, **extra_fields):
            user = self.create_user(username, email, password=password, **extra_fields)
            user.is_active = True
            user.is_staff = True
            user.is_admin = True
            user.save(using=self._db)
            return user
    
    
    class CustomUser(AbstractBaseUser, PermissionsMixin):
        email = models.EmailField(max_length=255, unique=True)
        username = models.CharField(max_length=255, unique=True)
        first_name = models.CharField(max_length=255)
        last_name = models.CharField(max_length=255)
        is_active = models.BooleanField(default=True)
        is_staff = models.BooleanField(default=False)
        is_admin = models.BooleanField(default=False)
    
        objects = CustomUserManager()
    
        USERNAME_FIELD = "email"
        REQUIRED_FIELDS = ["username", "first_name", "last_name"]
    
        def get_full_name(self):
            return f"{self.first_name} - {self.last_name}"
    
        def get_short_name(self):
            return self.username
    
        def has_perm(self, perm, obj=None):
            return True
    
        def has_module_perms(self, app_label):
            return True
    
        def __str__(self):
            return self.email
    

    직렬 변환기 사용자 지정



    계정/serializers.py

    from djoser.serializers import UserCreateSerializer
    from django.contrib.auth import get_user_model
    
    User = get_user_model()
    
    
    class UserCreateSerializer(UserCreateSerializer):
        class Meta(UserCreateSerializer.Meta):
            model = User
            fields = ("id", "email", "username", "first_name", "last_name", "password")
    
    

    이메일 설정: settings.py



    # EMAIL CONFIG
    EMAIL_BACKEND = "django.core.mail.backends.smtp.EmailBackend"
    EMAIL_HOST = "localhost"
    EMAIL_PORT = "1025"
    EMAIL_HOST_USER = ""
    EMAIL_HOST_PASSWORD = ""
    EMAIL_USE_TLS = False
    

    Djoser JWT 및 CORS 헤더: settings.py



    [참고: 프런트엔드 프레임워크나 라이브러리를 사용하지 않는 한 cors 헤더가 필요하지 않습니다.]

    REST_FRAMEWORK = {
        "DEFAULT_PERMISSION_CLASSES": ["rest_framework.permissions.IsAuthenticated"],
        "DEFAULT_AUTHENTICATION_CLASSES": (
            "rest_framework_simplejwt.authentication.JWTAuthentication",
        ),
    }
    
    
    SIMPLE_JWT = {
        "AUTH_HEADER_TYPES": ("JWT",),
        "ACCESS_TOKEN_LIFETIME": timedelta(minutes=60),
        "REFRESH_TOKEN_LIFETIME": timedelta(days=1),
        "AUTH_TOKEN_CLASSES": ("rest_framework_simplejwt.tokens.AccessToken",),
    }
    
    # DJOSER CONFIG
    DJOSER = {
        "LOGIN_FIELD": "email",
        "USER_CREATE_PASSWORD_RETYPE": True,
        "USERNAME_CHANGED_EMAIL_CONFIRMATION": True,
        "PASSWORD_CHANGED_EMAIL_CONFIRMATION": True,
        "SEND_CONFIRMATION_EMAIL": True,
        "SET_USERNAME_RETYPE": True,
        "SET_PASSWORD_RETYPE": True,
        "USERNAME_RESET_CONFIRM_URL": "password/reset/confirm/{uid}/{token}",
        "PASSWORD_RESET_CONFIRM_URL": "email/reset/confirm/{uid}/{token}",
        "ACTIVATION_URL": "activate/{uid}/{token}",
        "SEND_ACTIVATION_EMAIL": True,
        "SOCIAL_AUTH_TOKEN_STRATEGY": "djoser.social.token.jwt.TokenStrategy",
        "SOCIAL_AUTH_ALLOWED_REDIRECT_URIS": [
            "your redirect url",
            "your redirect url",
        ],
        "SERIALIZERS": {
            "user_create": "accounts.serializers.UserCreateSerializer",  # custom serializer
            "user": "djoser.serializers.UserSerializer",
            "current_user": "djoser.serializers.UserSerializer",
            "user_delete": "djoser.serializers.UserSerializer",
        },
    }
    
    # CORS HEADERS
    CORS_ORIGIN_ALLOW_ALL = True
    CORS_ALLOW_CREDENTIALS = True
    

    URL 구성:


  • 계정/urls.py

  • from django.urls import path
    
    
    urlpatterns = []
    
    

  • 메인/urls.py

  • #main/urls.py
    
    from django.contrib import admin
    from django.urls import path
    from django.urls.conf import include, re_path
    
    # DRF YASG
    from rest_framework import permissions
    from drf_yasg.views import get_schema_view
    from drf_yasg import openapi
    
    schema_view = get_schema_view(
        openapi.Info(
            title="Djoser API",
            default_version="v1",
            description="REST implementation of Django authentication system. djoser library provides a set of Django Rest Framework views to handle basic actions such as registration, login, logout, password reset and account activation. It works with custom user model.",
            contact=openapi.Contact(email="[email protected]"),
            license=openapi.License(name="BSD License"),
        ),
        public=True,
        permission_classes=(permissions.AllowAny,),
    )
    
    urlpatterns = [
        path("admin/", admin.site.urls),
        re_path(
            r"^api/v1/docs/$",
            schema_view.with_ui("swagger", cache_timeout=0),
            name="schema-swagger-ui",
        ),
        path("api/v1/", include("accounts.urls")),
        path("api/v1/", include("djoser.urls")),
        path("api/v1/", include("djoser.urls.jwt")),
    
    ]
    
    

    여기서 우리는:
  • djoser가 제공하는 일부 URL 경로를 포함합니다.
  • 및 API 문서 구성
    http://127.0.0.1:8000/api/v1/docs/



  • 다음은 몇 가지 URL입니다.
  • 사용자 등록
    http://127.0.0.1:8000/api/v1/users/

  • 사용자 활성화
    http://127.0.0.1:8000/api/v1/users/activation/


  • 두 개의 매개변수가 필요합니다.
    {
    "uid": "일부 uid",
    "token": "일부 토큰"
    }

    마찬가지로 아래 API로 작업할 수 있습니다.
  • 사용자 로그인
    http://127.0.0.1:8000/api/v1/jwt/create/
  • 암호 재설정
    http://127.0.0.1:8000/api/v1/users/reset_password/
  • 암호 재설정 확인
    http://127.0.0.1:8000/api/v1/users/reset_password_confirm/
  • 사용자 나
    http://127.0.0.1:8000/api/v1/users/me/

  • 소셜 인증으로도 작업할 수 있지만 추가 구성이 필요합니다.
    여기 내가 작업한 github 링크가 있습니다social auth.

    전반적으로 우리는 끝났습니다. 😌😌😌😌
    붙어 있다면 👇👇👇.




    리야마 / dj_djoser


    Django 인증 시스템의 REST 구현. djoser 라이브러리는 Django Rest Framework 보기 세트를 제공하여 등록, 로그인, 로그아웃, 비밀번호 재설정 및 계정 활성화와 같은 기본 작업을 처리합니다. 사용자 정의 사용자 모델과 함께 작동합니다.

    좋은 웹페이지 즐겨찾기