ฟังก์ชัน จดจำฉัน ด้วย JWT
This commit is contained in:
parent
23f9338935
commit
f615e51c5c
@ -2,6 +2,10 @@ from djoser.serializers import UserCreateSerializer as BaseUserCreateSerializer
|
|||||||
from rest_framework import serializers
|
from rest_framework import serializers
|
||||||
from .models import CustomUser
|
from .models import CustomUser
|
||||||
|
|
||||||
|
from rest_framework_simplejwt.serializers import TokenObtainPairSerializer
|
||||||
|
from rest_framework_simplejwt.tokens import RefreshToken
|
||||||
|
from django.conf import settings
|
||||||
|
|
||||||
class UserCreateSerializer(BaseUserCreateSerializer):
|
class UserCreateSerializer(BaseUserCreateSerializer):
|
||||||
# Serializer สำหรับการลงทะเบียน (Djoser จะใช้ตัวนี้)
|
# Serializer สำหรับการลงทะเบียน (Djoser จะใช้ตัวนี้)
|
||||||
class Meta(BaseUserCreateSerializer.Meta):
|
class Meta(BaseUserCreateSerializer.Meta):
|
||||||
@ -21,3 +25,35 @@ class UserSerializer(serializers.ModelSerializer):
|
|||||||
)
|
)
|
||||||
# ตั้งค่า is_active, is_staff, is_superuser เป็น read_only
|
# ตั้งค่า is_active, is_staff, is_superuser เป็น read_only
|
||||||
read_only_fields = ('id', 'username', 'is_active', 'is_staff', 'is_superuser', 'role')
|
read_only_fields = ('id', 'username', 'is_active', 'is_staff', 'is_superuser', 'role')
|
||||||
|
|
||||||
|
# Serializer สำหรับ Login JWT ที่รับค่า remember_me
|
||||||
|
class CustomTokenObtainPairSerializer(TokenObtainPairSerializer):
|
||||||
|
|
||||||
|
def validate(self, attrs):
|
||||||
|
# print("CustomTokenObtainPairSerializer called")
|
||||||
|
data = super().validate(attrs)
|
||||||
|
|
||||||
|
# รับ remember_me จาก request (รองรับ true/false ทั้ง bool และ string)
|
||||||
|
remember_raw = self.context['request'].data.get('remember_me', False)
|
||||||
|
|
||||||
|
remember_me = (
|
||||||
|
remember_raw is True or
|
||||||
|
str(remember_raw).lower() == "true" or
|
||||||
|
remember_raw == "1"
|
||||||
|
)
|
||||||
|
|
||||||
|
refresh = self.get_token(self.user)
|
||||||
|
|
||||||
|
# ฝัง remember_me ลงใน payload
|
||||||
|
refresh['remember_me'] = remember_me
|
||||||
|
|
||||||
|
# ถ้า remember_me=True → อายุ Refresh Token เป็น 30 วัน
|
||||||
|
if remember_me:
|
||||||
|
refresh.set_exp(
|
||||||
|
from_time=refresh.current_time,
|
||||||
|
lifetime=settings.SIMPLE_JWT['REFRESH_TOKEN_LIFETIME_REMEMBER_ME']
|
||||||
|
)
|
||||||
|
|
||||||
|
data['refresh'] = str(refresh)
|
||||||
|
data['access'] = str(refresh.access_token)
|
||||||
|
return data
|
||||||
|
|||||||
@ -1,3 +1,5 @@
|
|||||||
from django.shortcuts import render
|
from rest_framework_simplejwt.views import TokenObtainPairView
|
||||||
|
from .serializers import CustomTokenObtainPairSerializer
|
||||||
|
|
||||||
# Create your views here.
|
class CustomTokenObtainPairView(TokenObtainPairView):
|
||||||
|
serializer_class = CustomTokenObtainPairSerializer
|
||||||
|
|||||||
@ -13,6 +13,8 @@ https://docs.djangoproject.com/en/5.2/ref/settings/
|
|||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
import os
|
import os
|
||||||
|
|
||||||
|
from datetime import timedelta
|
||||||
|
|
||||||
try:
|
try:
|
||||||
from dotenv import load_dotenv
|
from dotenv import load_dotenv
|
||||||
load_dotenv() # โหลดตัวแปรจาก .env ใน Local Dev
|
load_dotenv() # โหลดตัวแปรจาก .env ใน Local Dev
|
||||||
@ -208,6 +210,17 @@ REST_FRAMEWORK = {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
SIMPLE_JWT = {
|
||||||
|
# ชี้ไปที่ Custom Serializer ที่อยู่ใน accounts.serializers
|
||||||
|
'TOKEN_OBTAIN_PAIR_SERIALIZER': 'accounts.serializers.CustomTokenObtainPairSerializer',
|
||||||
|
|
||||||
|
'ACCESS_TOKEN_LIFETIME': timedelta(minutes=15),
|
||||||
|
'REFRESH_TOKEN_LIFETIME': timedelta(days=1),
|
||||||
|
'REFRESH_TOKEN_LIFETIME_REMEMBER_ME': timedelta(days=30),
|
||||||
|
|
||||||
|
# การตั้งค่าอื่น ๆ ของ SIMPLE_JWT ในอนาคต
|
||||||
|
}
|
||||||
|
|
||||||
# 3. ตั้งค่า DJOSER (เพื่อจัดการ Auth Endpoints)
|
# 3. ตั้งค่า DJOSER (เพื่อจัดการ Auth Endpoints)
|
||||||
DOMAIN = "localhost:5173"
|
DOMAIN = "localhost:5173"
|
||||||
SITE_NAME = 'localhost:5173' # หรือชื่อ Domain จริง
|
SITE_NAME = 'localhost:5173' # หรือชื่อ Domain จริง
|
||||||
|
|||||||
@ -25,6 +25,8 @@ from drf_spectacular.views import SpectacularAPIView, SpectacularSwaggerView, Sp
|
|||||||
from api.views.health_check_view import SystemHealthCheck
|
from api.views.health_check_view import SystemHealthCheck
|
||||||
from api.views.audit_viewset import AuditLogViewSet
|
from api.views.audit_viewset import AuditLogViewSet
|
||||||
|
|
||||||
|
from accounts.views import CustomTokenObtainPairView
|
||||||
|
|
||||||
# 1. กำหนดตัวแปร router ก่อนใช้งาน
|
# 1. กำหนดตัวแปร router ก่อนใช้งาน
|
||||||
router = DefaultRouter()
|
router = DefaultRouter()
|
||||||
|
|
||||||
@ -56,6 +58,7 @@ urlpatterns = [
|
|||||||
path('api/schema/redoc/', SpectacularRedocView.as_view(url_name='schema'), name='redoc'),
|
path('api/schema/redoc/', SpectacularRedocView.as_view(url_name='schema'), name='redoc'),
|
||||||
|
|
||||||
# Endpoints สำหรับการยืนยันตัวตน (Login, Logout, Register)
|
# Endpoints สำหรับการยืนยันตัวตน (Login, Logout, Register)
|
||||||
|
path("api/v1/auth/jwt/create/", CustomTokenObtainPairView.as_view(), name="jwt-create"),
|
||||||
path('api/v1/auth/', include('djoser.urls')), # /users/ (Register/Update/Me), /users/set_password
|
path('api/v1/auth/', include('djoser.urls')), # /users/ (Register/Update/Me), /users/set_password
|
||||||
path('api/v1/auth/', include('djoser.urls.jwt')), # /jwt/create (Login), /jwt/refresh (Refresh Token)
|
path('api/v1/auth/', include('djoser.urls.jwt')), # /jwt/create (Login), /jwt/refresh (Refresh Token)
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user