diff --git a/account/serializers.py b/account/serializers.py index d75039a..bbde6a0 100644 --- a/account/serializers.py +++ b/account/serializers.py @@ -125,12 +125,17 @@ class GuardianSerializer(serializers.ModelSerializer): first_name = serializers.SerializerMethodField('get_first_name') last_name = serializers.SerializerMethodField('get_last_name') auth_token = serializers.SerializerMethodField('get_auth_token') + refresh_token = serializers.SerializerMethodField('get_refresh_token') def get_auth_token(self, obj): refresh = RefreshToken.for_user(obj.user) access_token = str(refresh.access_token) return access_token + def get_refresh_token(self, obj): + refresh = RefreshToken.for_user(obj.user) + refresh_token = str(refresh) + return refresh_token def get_user_type(self, obj): """user type""" @@ -154,9 +159,9 @@ class GuardianSerializer(serializers.ModelSerializer): class Meta(object): """Meta info""" model = Guardian - fields = ['id', 'auth_token', 'email', 'first_name', 'last_name', 'country_code', 'phone', 'family_name', - 'gender', 'dob', 'referral_code', 'is_active', 'is_complete_profile', 'passcode', 'image', - 'created_at', 'updated_at', 'user_type', 'country_name'] + fields = ['id', 'auth_token', 'refresh_token', 'email', 'first_name', 'last_name', 'country_code', + 'phone', 'family_name', 'gender', 'dob', 'referral_code', 'is_active', + 'is_complete_profile', 'passcode', 'image', 'created_at', 'updated_at', 'user_type', 'country_name'] class JuniorSerializer(serializers.ModelSerializer): @@ -166,15 +171,21 @@ class JuniorSerializer(serializers.ModelSerializer): first_name = serializers.SerializerMethodField('get_first_name') last_name = serializers.SerializerMethodField('get_last_name') auth_token = serializers.SerializerMethodField('get_auth_token') + refresh_token = serializers.SerializerMethodField('get_refresh_token') def get_auth_token(self, obj): refresh = RefreshToken.for_user(obj.auth) access_token = str(refresh.access_token) return access_token + def get_refresh_token(self, obj): + refresh = RefreshToken.for_user(obj.user) + refresh_token = str(refresh) + return refresh_token + def get_user_type(self, obj): email_verified = UserEmailOtp.objects.filter(email=obj.auth.username).last() - if email_verified and email_verified.user_type != None: + if email_verified and email_verified.user_type is not None: return email_verified.user_type return '1' @@ -190,9 +201,9 @@ class JuniorSerializer(serializers.ModelSerializer): class Meta(object): """Meta info""" model = Junior - fields = ['id', 'auth_token', 'email', 'first_name', 'last_name', 'country_code', 'phone', 'gender', 'dob', - 'guardian_code', 'referral_code','is_active', 'is_complete_profile', 'created_at', 'image', - 'updated_at', 'user_type', 'country_name','is_invited'] + fields = ['id', 'auth_token', 'refresh_token', 'email', 'first_name', 'last_name', 'country_code', + 'phone', 'gender', 'dob', 'guardian_code', 'referral_code','is_active', + 'is_complete_profile', 'created_at', 'image', 'updated_at', 'user_type', 'country_name','is_invited'] class EmailVerificationSerializer(serializers.ModelSerializer): """Email verification serializer""" diff --git a/account/urls.py b/account/urls.py index f2a1d62..9977658 100644 --- a/account/urls.py +++ b/account/urls.py @@ -8,7 +8,7 @@ from .views import (UserLogin, SendPhoneOtp, UserPhoneVerification, UserEmailVer ForgotPasswordAPIView, ResetPasswordAPIView, ChangePasswordAPIView, UpdateProfileImage, GoogleLoginViewSet, SigninWithApple, ProfileAPIViewSet, UploadImageAPIViewSet, DefaultImageAPIViewSet, DeleteUserProfileAPIViewSet, UserNotificationAPIViewSet, - UpdateUserNotificationAPIViewSet, SendSupportEmail, LogoutAPIView) + UpdateUserNotificationAPIViewSet, SendSupportEmail, LogoutAPIView, AccessTokenAPIView) """Router""" router = routers.SimpleRouter() @@ -45,5 +45,6 @@ urlpatterns = [ path('api/v1/update-profile-image/', UpdateProfileImage.as_view()), path('api/v1/apple-login/', SigninWithApple.as_view(), name='signup_with_apple'), path('api/v1/send-support-email/', SendSupportEmail.as_view(), name='send-support-email'), - path('api/v1/logout/', LogoutAPIView.as_view(), name='logout') + path('api/v1/logout/', LogoutAPIView.as_view(), name='logout'), + path('api/v1/generate-token/', AccessTokenAPIView.as_view(), name='generate-token') ] diff --git a/account/views.py b/account/views.py index 0adc33c..fcc5ecb 100644 --- a/account/views.py +++ b/account/views.py @@ -37,6 +37,7 @@ from rest_framework import status import requests from rest_framework.response import Response from django.conf import settings +from rest_framework_simplejwt.tokens import RefreshToken from junior.serializers import JuniorProfileSerializer from guardian.serializers import GuardianProfileSerializer @@ -302,7 +303,8 @@ class UserLogin(viewsets.ViewSet): email_verified = UserEmailOtp.objects.filter(email=username).last() refresh = RefreshToken.for_user(user) access_token = str(refresh.access_token) - data = {"auth_token":access_token, "is_profile_complete": False, + refresh_token = str(refresh) + data = {"auth_token":access_token, "refresh_token":refresh_token, "is_profile_complete": False, "user_type": email_verified.user_type, } is_verified = False @@ -336,7 +338,8 @@ class UserLogin(viewsets.ViewSet): logging.error(e) refresh = RefreshToken.for_user(user) access_token = str(refresh.access_token) - data = {"auth_token": access_token, "user_role": '3'} + refresh_token = str(refresh) + data = {"auth_token": access_token, "refresh_token":refresh_token, "user_type": '3'} return custom_response(None, data, response_status=status.HTTP_200_OK) class UserEmailVerification(viewsets.ModelViewSet): @@ -373,7 +376,8 @@ class UserEmailVerification(viewsets.ModelViewSet): guardian_data.save() refresh = RefreshToken.for_user(user_obj) access_token = str(refresh.access_token) - return custom_response(SUCCESS_CODE['3011'], {"auth_token":access_token}, + refresh_token = str(refresh) + return custom_response(SUCCESS_CODE['3011'], {"auth_token":access_token, "refresh_token":refresh_token}, response_status=status.HTTP_200_OK) else: return custom_error_response(ERROR_CODE["2008"], response_status=status.HTTP_400_BAD_REQUEST) @@ -521,3 +525,17 @@ class LogoutAPIView(views.APIView): logout(request) request.session.flush() return custom_response(SUCCESS_CODE['3020'], response_status=status.HTTP_200_OK) + + +class AccessTokenAPIView(views.APIView): + """generate access token API""" + + def post(self, request): + # Assuming you have a refresh_token string + refresh_token = request.data['refresh_token'] + # Create a RefreshToken instance from the refresh token string + refresh = RefreshToken(refresh_token) + # Generate a new access token + access_token = str(refresh.access_token) + data = {"auth_token": access_token} + return custom_response(None, data, response_status=status.HTTP_200_OK) diff --git a/zod_bank/settings.py b/zod_bank/settings.py index d98d2db..687b42b 100644 --- a/zod_bank/settings.py +++ b/zod_bank/settings.py @@ -97,8 +97,8 @@ REST_FRAMEWORK = { 'PAGE_SIZE': 5, } SIMPLE_JWT = { - 'ACCESS_TOKEN_LIFETIME': timedelta(minutes=50), - 'REFRESH_TOKEN_LIFETIME': timedelta(days=7), + 'ACCESS_TOKEN_LIFETIME': timedelta(hours=2, minutes=59, seconds=59, microseconds=999999), + 'REFRESH_TOKEN_LIFETIME': timedelta(hours=71, minutes=59, seconds=59, microseconds=999999), } # Database # https://docs.djangoproject.com/en/3.0/ref/settings/#databases