Djoser로 인증
요구 사항:
MailHog (개발자를 위한 이메일 테스트 도구)
프로젝트 설정:
가상 환경을 만듭니다.
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 구성:
from django.urls import path
urlpatterns = []
#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")),
]
여기서 우리는:
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 보기 세트를 제공하여 등록, 로그인, 로그아웃, 비밀번호 재설정 및 계정 활성화와 같은 기본 작업을 처리합니다. 사용자 정의 사용자 모델과 함께 작동합니다.
Reference
이 문제에 관하여(Djoser로 인증), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/lyamaa/authenticate-with-djoser-2kf7텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)