jira-5 google login and apple login

This commit is contained in:
jain
2023-06-30 21:25:43 +05:30
parent 79ac140ddd
commit d2498f82ad
5 changed files with 139 additions and 54 deletions

View File

@ -13,7 +13,7 @@ from rest_framework.decorators import action
from django.contrib.auth import authenticate, login from django.contrib.auth import authenticate, login
from rest_framework_simplejwt.tokens import RefreshToken from rest_framework_simplejwt.tokens import RefreshToken
from guardian.utils import upload_image_to_alibaba from guardian.utils import upload_image_to_alibaba
from .utils import get_token
class GoogleSignInSerializer(serializers.Serializer): class GoogleSignInSerializer(serializers.Serializer):
"""Google login Serializer""" """Google login Serializer"""
email = serializers.EmailField() email = serializers.EmailField()
@ -139,11 +139,13 @@ class GuardianSerializer(serializers.ModelSerializer):
first_name = serializers.SerializerMethodField('get_first_name') first_name = serializers.SerializerMethodField('get_first_name')
last_name = serializers.SerializerMethodField('get_last_name') last_name = serializers.SerializerMethodField('get_last_name')
auth_token = serializers.SerializerMethodField('get_auth_token') auth_token = serializers.SerializerMethodField('get_auth_token')
refresh_token = serializers.SerializerMethodField('get_refresh_token')
def get_auth_token(self, obj): def get_auth_token(self, obj):
refresh = RefreshToken.for_user(obj.user) return get_token()['access']
access_token = str(refresh.access_token) def get_refresh_token(self, obj):
return access_token return get_token()['refresh']
def get_user_type(self, obj): def get_user_type(self, obj):
"""user type""" """user type"""
@ -164,7 +166,7 @@ class GuardianSerializer(serializers.ModelSerializer):
class Meta(object): class Meta(object):
"""Meta info""" """Meta info"""
model = Guardian model = Guardian
fields = ['auth_token', 'email', 'first_name', 'last_name', 'country_code', 'phone', 'family_name', 'gender', 'dob', fields = ['auth_token', 'refresh_token', 'email', 'first_name', 'last_name', 'country_code', 'phone', 'family_name', 'gender', 'dob',
'referral_code', 'is_active', 'is_complete_profile', 'passcode', 'referral_code', 'is_active', 'is_complete_profile', 'passcode',
'created_at', 'updated_at', 'user_type'] 'created_at', 'updated_at', 'user_type']
@ -176,11 +178,12 @@ class JuniorSerializer(serializers.ModelSerializer):
first_name = serializers.SerializerMethodField('get_first_name') first_name = serializers.SerializerMethodField('get_first_name')
last_name = serializers.SerializerMethodField('get_last_name') last_name = serializers.SerializerMethodField('get_last_name')
auth_token = serializers.SerializerMethodField('get_auth_token') auth_token = serializers.SerializerMethodField('get_auth_token')
refresh_token = serializers.SerializerMethodField('get_refresh_token')
def get_auth_token(self, obj): def get_auth_token(self, obj):
refresh = RefreshToken.for_user(obj.auth) return get_token()['access']
access_token = str(refresh.access_token) def get_refresh_token(self, obj):
return access_token return get_token()['refresh']
def get_user_type(self, obj): def get_user_type(self, obj):
return JUNIOR return JUNIOR
@ -197,7 +200,7 @@ class JuniorSerializer(serializers.ModelSerializer):
class Meta(object): class Meta(object):
"""Meta info""" """Meta info"""
model = Junior model = Junior
fields = ['auth_token', 'email', 'first_name', 'last_name', 'country_code', 'phone', 'gender', 'dob', fields = ['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', 'guardian_code', 'referral_code','is_active', 'is_complete_profile', 'created_at',
'updated_at', 'user_type'] 'updated_at', 'user_type']

View File

@ -6,14 +6,14 @@ from rest_framework.decorators import api_view
from rest_framework import routers from rest_framework import routers
from .views import (UserLogin, SendPhoneOtp, UserPhoneVerification, UserEmailVerification, ReSendEmailOtp, from .views import (UserLogin, SendPhoneOtp, UserPhoneVerification, UserEmailVerification, ReSendEmailOtp,
ForgotPasswordAPIView, ResetPasswordAPIView, ChangePasswordAPIView, UpdateProfileImage, ForgotPasswordAPIView, ResetPasswordAPIView, ChangePasswordAPIView, UpdateProfileImage,
GoogleLoginViewSet1) GoogleLoginViewSet, SigninWithApple)
"""Router""" """Router"""
router = routers.SimpleRouter() router = routers.SimpleRouter()
"""API End points with router""" """API End points with router"""
router.register('user', UserLogin, basename='user') router.register('user', UserLogin, basename='user')
router.register('admin', UserLogin, basename='admin') router.register('admin', UserLogin, basename='admin')
router.register('google-login', GoogleLoginViewSet1, basename='admin') router.register('google-login', GoogleLoginViewSet, basename='admin')
router.register('send-phone-otp', SendPhoneOtp, basename='send-phone-otp') router.register('send-phone-otp', SendPhoneOtp, basename='send-phone-otp')
router.register('user-phone-verification', UserPhoneVerification, basename='user-phone-verification') router.register('user-phone-verification', UserPhoneVerification, basename='user-phone-verification')
router.register('user-email-verification', UserEmailVerification, basename='user-email-verification') router.register('user-email-verification', UserEmailVerification, basename='user-email-verification')
@ -23,5 +23,6 @@ urlpatterns = [
path('api/v1/forgot-password/', ForgotPasswordAPIView.as_view()), path('api/v1/forgot-password/', ForgotPasswordAPIView.as_view()),
path('api/v1/reset-password/', ResetPasswordAPIView.as_view()), path('api/v1/reset-password/', ResetPasswordAPIView.as_view()),
path('api/v1/change-password/', ChangePasswordAPIView.as_view()), path('api/v1/change-password/', ChangePasswordAPIView.as_view()),
path('api/v1/update-profile-image/', UpdateProfileImage.as_view()) path('api/v1/update-profile-image/', UpdateProfileImage.as_view()),
path('api/v1/apple-login/', SigninWithApple.as_view(), name='signup_with_apple'),
] ]

View File

@ -3,8 +3,13 @@
from django.conf import settings from django.conf import settings
from rest_framework import viewsets, status from rest_framework import viewsets, status
from rest_framework.response import Response from rest_framework.response import Response
from templated_email import send_templated_mail from templated_email import send_templated_mail
import jwt
from datetime import datetime
from calendar import timegm
from uuid import uuid4
import secrets
def send_otp_email(recipient_email, otp): def send_otp_email(recipient_email, otp):
from_email = settings.EMAIL_FROM_ADDRESS from_email = settings.EMAIL_FROM_ADDRESS
recipient_list = [recipient_email] recipient_list = [recipient_email]
@ -36,3 +41,53 @@ def custom_error_response(detail, response_status):
if not detail: if not detail:
detail = {} detail = {}
return Response({"error": detail, "status": "failed", "code": response_status}) return Response({"error": detail, "status": "failed", "code": response_status})
def get_user_data(attrs):
"""
used to decode token
"""
user_data = jwt.decode(jwt=attrs['token'], options={'verify_signature': False},
algorithms=['RS256'])
return user_data
def generate_jwt_token(token_type: str, now_time: int, data: dict = dict):
"""
used to generate jwt token
"""
if type(data) == type:
data = {}
data.update({
'token_type': token_type,
'iss': 'your_site_url',
'iat': timegm(datetime.utcnow().utctimetuple()),
'jti': uuid4().hex
})
TOKEN_TYPE = ["access", "refresh"]
if token_type == TOKEN_TYPE[1]:
exp = now_time + settings.SIMPLE_JWT['REFRESH_TOKEN_LIFETIME']
else:
exp = now_time + settings.SIMPLE_JWT['ACCESS_TOKEN_LIFETIME']
data.update({
"exp": timegm(exp.utctimetuple())
})
signing_key = secrets.token_hex(32)
return jwt.encode(payload=data, key=signing_key,
algorithm='HS256')
def get_token(data: dict = dict):
""" create access and refresh token """
now_time = datetime.utcnow()
access = generate_jwt_token('access', now_time, data)
refresh = generate_jwt_token('refresh', now_time, data)
return {
'access': access,
'refresh': refresh
}

View File

@ -2,6 +2,7 @@ from rest_framework import viewsets, status, views
from rest_framework.decorators import action from rest_framework.decorators import action
import random import random
import logging import logging
import jwt
from django.contrib.auth import authenticate, login from django.contrib.auth import authenticate, login
from guardian.models import Guardian from guardian.models import Guardian
from junior.models import Junior from junior.models import Junior
@ -13,22 +14,17 @@ from .serializers import (SuperUserSerializer, GuardianSerializer, JuniorSeriali
from rest_framework_simplejwt.tokens import RefreshToken from rest_framework_simplejwt.tokens import RefreshToken
from base.messages import ERROR_CODE, SUCCESS_CODE from base.messages import ERROR_CODE, SUCCESS_CODE
from guardian.tasks import generate_otp from guardian.tasks import generate_otp
from django.conf import settings
from account.utils import send_otp_email from account.utils import send_otp_email
from account.utils import custom_response, custom_error_response from account.utils import custom_response, custom_error_response
from django.core.mail import EmailMessage
from django.core.mail import send_mail
from rest_framework.response import Response
from rest_framework.permissions import IsAuthenticated from rest_framework.permissions import IsAuthenticated
from templated_email import send_templated_mail from templated_email import send_templated_mail
import google.oauth2.credentials import google.oauth2.credentials
import google.auth.transport.requests import google.auth.transport.requests
from rest_framework import status from rest_framework import status
from rest_framework.response import Response from rest_framework.response import Response
import requests import requests
from django.conf import settings from django.conf import settings
# from apps.accounts.utility import get_token from .utils import get_token
class GoogleLoginMixin: class GoogleLoginMixin:
@ -65,9 +61,18 @@ class GoogleLoginMixin:
# Check if the user exists in your database or create a new user # Check if the user exists in your database or create a new user
# ... # ...
if User.objects.filter(email__iexact=email).exists(): user_data = User.objects.filter(email__iexact=email)
if user_data.exists():
print("00000000000") print("00000000000")
return custom_response(SUCCESS_CODE['3003'], response_status=status.HTTP_200_OK) if str(user_type) == '1':
junior_query = Junior.objects.filter(auth=user_data.last()).last()
serializer = JuniorSerializer(junior_query)
if str(user_type) == '2':
guardian_query = Guardian.objects.filter(user=user_data.last()).last()
print("guardian_query==>",guardian_query,'====>',type(guardian_query))
serializer = GuardianSerializer(guardian_query)
return custom_response(SUCCESS_CODE['3003'], serializer.data,
response_status=status.HTTP_200_OK)
if not User.objects.filter(email__iexact=email).exists(): if not User.objects.filter(email__iexact=email).exists():
print("999999999999999") print("999999999999999")
@ -80,9 +85,11 @@ class GoogleLoginMixin:
# Return a JSON response with the user's email and name # Return a JSON response with the user's email and name
return Response({'token': "get_token()", 'name': name, 'email': email, 'profile_picture': profile_picture}) return custom_response(SUCCESS_CODE['3003'], {'auth_token': get_token(), 'name': name, 'email': email,
'profile_picture': profile_picture, "user_type":user_type},
response_status=status.HTTP_200_OK)
class GoogleLoginViewSet1(GoogleLoginMixin, viewsets.GenericViewSet): class GoogleLoginViewSet(GoogleLoginMixin, viewsets.GenericViewSet):
serializer_class = GoogleLoginSerializer1 serializer_class = GoogleLoginSerializer1
def create(self, request): def create(self, request):
@ -91,27 +98,46 @@ class GoogleLoginViewSet1(GoogleLoginMixin, viewsets.GenericViewSet):
print("88888888888888888888888888") print("88888888888888888888888888")
return self.google_login(request) return self.google_login(request)
# class GoogleLoginAPIViewset(viewsets.ModelViewSet): class SigninWithApple(views.APIView):
# """Google Login""" """This API is for sign in with Apple for app."""
# serializer_class = GoogleSignInSerializer def post(self, request):
# token = request.data.get("identityToken")
# def create(self, request, *args, **kwargs): user_type = request.data.get("user_type")
# """ if not token:
# Override default behaviour of create method return Response({"message": "data should contain `identityToken`"})
# """ decoded_data = jwt.decode(token, options={"verify_signature": False})
# provider_type = [] print("decoded_data===>",decoded_data)
# serializer = self.get_serializer(data=request.data) user_data = {"email": decoded_data.get('email'),"username": decoded_data.get('email'),
# if serializer.is_valid(raise_exception=True): "first_name": request.data.get("fullName").get("givenName"),"is_active": True,
# # provider = self.get_provider_view(request.data.get('provider')) "last_name": request.data.get("fullName").get("familyName"),}
# # if User is not authenticated then send error message if user_data['email'] and not user_data['first_name']:
# # if not provider.is_authenticated(request): user_data['first_name'] = user_data['email'].split("@")[0]
# # return custom_error_response({}, status.HTTP_400_BAD_REQUEST) user_data['last_name'] = user_data['email'].split("@")[0]
# if decoded_data.get("email"):
# user = serializer.save() try:
# if User.objects.filter(email__iexact=user.email).exists(): user = User.objects.get(email=decoded_data.get("email"))
# print("ppppppppppppp") if str(user_type) == '1':
# return custom_response(SUCCESS_CODE["3003"], response_status=status.HTTP_200_OK) junior_query = Junior.objects.filter(auth=user).last()
# return custom_response(ERROR_CODE["2002"], response_status=status.HTTP_400_BAD_REQUEST) print("junior_query==>", junior_query, '====>', type(junior_query))
serializer = JuniorSerializer(junior_query)
if str(user_type) == '2':
guardian_query = Guardian.objects.filter(user=user).last()
print("guardian_query==>", guardian_query, '====>', type(guardian_query))
serializer = GuardianSerializer(guardian_query)
return custom_response(SUCCESS_CODE['3003'], serializer.data,
response_status=status.HTTP_200_OK)
except User.DoesNotExist:
user = User.objects.create(**user_data)
if str(user_type) == '1':
junior_query = Junior.objects.create(auth=user, is_verified=True, is_active=True)
serializer = JuniorSerializer(junior_query)
if str(user_type) == '2':
guardian_query = Guardian.objects.create(user=user, is_verified=True, is_active=True)
serializer = GuardianSerializer(guardian_query)
return custom_response(SUCCESS_CODE['3003'], serializer.data,
response_status=status.HTTP_200_OK)
class UpdateProfileImage(views.APIView): class UpdateProfileImage(views.APIView):
permission_classes = [IsAuthenticated] permission_classes = [IsAuthenticated]

View File

@ -96,7 +96,7 @@ REST_FRAMEWORK = {
] ]
} }
SIMPLE_JWT = { SIMPLE_JWT = {
'ACCESS_TOKEN_LIFETIME': timedelta(minutes=15), 'ACCESS_TOKEN_LIFETIME': timedelta(minutes=50),
'REFRESH_TOKEN_LIFETIME': timedelta(days=7), 'REFRESH_TOKEN_LIFETIME': timedelta(days=7),
} }
# Database # Database
@ -172,15 +172,15 @@ CORS_ALLOW_HEADERS = (
"""Static files (CSS, JavaScript, Images) """Static files (CSS, JavaScript, Images)
https://docs.djangoproject.com/en/3.0/howto/static-files/""" https://docs.djangoproject.com/en/3.0/howto/static-files/"""
AUTHENTICATION_BACKENDS = [ # AUTHENTICATION_BACKENDS = [
'social_core.backends.google.GoogleOAuth2', # 'social_core.backends.google.GoogleOAuth2',
'django.contrib.auth.backends.ModelBackend', # 'django.contrib.auth.backends.ModelBackend',
] # ]
#
LOGIN_URL = 'login' # LOGIN_URL = 'login'
LOGIN_REDIRECT_URL = 'home' # LOGIN_REDIRECT_URL = 'home'
LOGOUT_URL = 'logout' # LOGOUT_URL = 'logout'
LOGOUT_REDIRECT_URL = 'login' # LOGOUT_REDIRECT_URL = 'login'
# SOCIAL_AUTH_GOOGLE_OAUTH2_KEY = '' # SOCIAL_AUTH_GOOGLE_OAUTH2_KEY = ''
# SOCIAL_AUTH_GOOGLE_OAUTH2_SECRET = '' # SOCIAL_AUTH_GOOGLE_OAUTH2_SECRET = ''