Я хочу сделать социальную регистрацию без валидации токенов
При регистрации через google или facebook этот код проверяет его с токеном пользователя, я хочу сделать так, чтобы код не проверял его и мог зарегистрировать и сохранить любого пользователя, даже если его токен не верен
GOOGLE_CLIENT_ID - секретный код учетной записи google
SOCIAL_SECRET - секретный код учетной записи facebook
Длинный токен id приходит на auut_token, который я беру из https://www.googleapis.com/auth/userinfo.email, но мне нужно иметь возможность ввести любой токен в поле и он зарегистрирует его в любом случае. Буду очень признателен за помощь
Мой serializers.py
from rest_framework import serializers
from . import google, facebook
from .register import register_social_user
import os
from rest_framework.exceptions import AuthenticationFailed
class FacebookSocialAuthSerializer(serializers.Serializer):
"""Handles serialization of facebook related data"""
auth_token = serializers.CharField()
login = serializers.CharField()
def validate_auth_token(self, auth_token):
user_data = facebook.Facebook.validate(auth_token)
try:
user_id = user_data['id']
email = user_data['email']
first_name = user_data['first_name']
provider = 'facebook'
return register_social_user(
provider=provider,
user_id=user_id,
email=email,
first_name=first_name
)
except Exception as identifier:
raise serializers.ValidationError(
'The token is invalid or expired. Please login again.'
)
class GoogleSocialAuthSerializer(serializers.Serializer, ):
auth_token = serializers.CharField()
email = serializers.EmailField
def validate_auth_token(self, auth_token):
user_data = google.Google.validate(auth_token)
try:
user_data['sub']
print(user_data['sub'])
except:
raise serializers.ValidationError(
'The token is invalid or expired. Please login again.'
)
from phrasebook.settings import GOOGLE_CLIENT_ID
if user_data['aud'] != GOOGLE_CLIENT_ID:
raise AuthenticationFailed('oops, who are you?')
email = user_data['email']
first_name = user_data.get('first_name', '')
provider = 'google'
return register_social_user(
provider=provider, email=email, first_name=first_name)
register.py
from django.contrib.auth import authenticate
from phrasebook.settings import SOCIAL_SECRET
from accounts.models import MyUser
import random
from rest_framework.exceptions import AuthenticationFailed
def generate_first_name(name):
first_name = "".join(name.split(' ')).lower()
if not MyUser.objects.filter(first_name=first_name).exists():
return first_name
else:
random_username = first_name + str(random.randint(0, 1000))
return generate_first_name(random_username)
def register_social_user(provider, email, first_name):
filtered_user_by_email = MyUser.objects.filter(email=email)
if filtered_user_by_email.exists():
if provider == filtered_user_by_email[0].auth_provider:
registered_user = authenticate(
email=email, password=SOCIAL_SECRET
)
return {
# 'first_name': registered_user.first_name,
'email': registered_user.email,
'tokens': registered_user.tokens()
}
else:
raise AuthenticationFailed(
detail='Please continue your login using ' + filtered_user_by_email[0].auth_provider)
else:
user = {
'first_name': generate_first_name(first_name), 'email': email,
'password': SOCIAL_SECRET}
user = MyUser.objects.create_user(**user)
user.is_active = True
user.activation_code = ''
user.auth_provider = provider
user.save()
return 'Successfully registered'
google.py
from google.auth.transport import requests
from google.oauth2 import id_token
class Google:
"""Google class to fetch the user info and return it"""
@staticmethod
def validate(auth_token):
"""
validate method Queries the Google oAUTH2 api to fetch the user info
"""
try:
idinfo = id_token.verify_oauth2_token(
auth_token, requests.Request())
if 'accounts.google.com' in idinfo['iss']:
return idinfo
except:
return "The token is either invalid or has expired"
facebook.py
import facebook
class Facebook:
"""
Facebook class to fetch the user info and return it
"""
@staticmethod
def validate(auth_token):
"""
validate method Queries the facebook GraphAPI to fetch the user info
"""
try:
graph = facebook.GraphAPI(access_token=auth_token)
profile = graph.request('/me?fields=name,email')
return profile
except:
return "The token is invalid or expired."
views.py
from rest_framework import status
from rest_framework.response import Response
from rest_framework.generics import GenericAPIView
from .serializers import GoogleSocialAuthSerializer, FacebookSocialAuthSerializer
class GoogleSocialAuthView(GenericAPIView):
serializer_class = GoogleSocialAuthSerializer
def post(self, request):
"""
POST with "auth_token"
Send an idtoken as from google to get user information
"""
serializer = self.serializer_class(data=request.data)
serializer.is_valid(raise_exception=True)
data = ((serializer.validated_data)['auth_token'])
return Response(data, status=status.HTTP_200_OK)
class FacebookSocialAuthView(GenericAPIView):
serializer_class = FacebookSocialAuthSerializer
def post(self, request):
"""
POST with "auth_token"
Send an access token as from facebook to get user information
"""
serializer = self.serializer_class(data=request.data)
serializer.is_valid(raise_exception=True)
data = ((serializer.validated_data)['auth_token'])
return Response(data, status=status.HTTP_200_OK)