ฟังก์ชัน จดจำฉัน ด้วย 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 .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
|
||||
|
||||
@ -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
|
||||
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 จริง
|
||||
|
||||
@ -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)
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user