Я хочу сделать социальную регистрацию без валидации токенов

При регистрации через 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)
Вернуться на верх