ฟังก์ชัน จดจำฉัน ด้วย JWT

This commit is contained in:
Flook 2025-11-16 07:41:33 +07:00
parent 23f9338935
commit f615e51c5c
4 changed files with 56 additions and 2 deletions

View File

@ -2,6 +2,10 @@ from djoser.serializers import UserCreateSerializer as BaseUserCreateSerializer
from rest_framework import serializers
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):
# Serializer สำหรับการลงทะเบียน (Djoser จะใช้ตัวนี้)
class Meta(BaseUserCreateSerializer.Meta):
@ -21,3 +25,35 @@ class UserSerializer(serializers.ModelSerializer):
)
# ตั้งค่า is_active, is_staff, is_superuser เป็น read_only
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

View File

@ -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

View File

@ -13,6 +13,8 @@ https://docs.djangoproject.com/en/5.2/ref/settings/
from pathlib import Path
import os
from datetime import timedelta
try:
from dotenv import load_dotenv
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)
DOMAIN = "localhost:5173"
SITE_NAME = 'localhost:5173' # หรือชื่อ Domain จริง

View File

@ -25,6 +25,8 @@ from drf_spectacular.views import SpectacularAPIView, SpectacularSwaggerView, Sp
from api.views.health_check_view import SystemHealthCheck
from api.views.audit_viewset import AuditLogViewSet
from accounts.views import CustomTokenObtainPairView
# 1. กำหนดตัวแปร router ก่อนใช้งาน
router = DefaultRouter()
@ -56,6 +58,7 @@ urlpatterns = [
path('api/schema/redoc/', SpectacularRedocView.as_view(url_name='schema'), name='redoc'),
# 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.jwt')), # /jwt/create (Login), /jwt/refresh (Refresh Token)