Используя Django и allauth, как мы можем остановить аутентификацию пользователя с одним и тем же адресом электронной почты для двух социальных аккаунтов?

Я новичок в Django и пытался реализовать описанный ниже сценарий, который выглядит следующим образом:

У меня есть аккаунт google, а также аккаунт facebook с одним и тем же адресом электронной почты с помощью django-allauth. Поэтому если я уже вошел в систему, используя учетную запись google/facebook, и пытаюсь войти в систему с facebook/google, т.е. с другой социальной учетной записи в той же сессии, я должен показать, что пользователь уже входил в систему с этим идентификатором электронной почты. Мой подход заключается в том, чтобы установить email и id провайдера в запросе сессии и манипулировать ими в сигнале pre_social_login в моем социальном адаптере.

На данный момент я определил свое промежуточное ПО следующим образом:

middleware.py

from django.contrib import messages
class SimpleMiddleware(object):
    def __init__(self, get_response):
        self.get_response = get_response
        # One-time configuration and initialization.
    def __call__(self, request):
        # Code to be executed for each request before
        # the view (and later middleware) are called.
        if request.path == '/accounts/login/' and request.method == 'GET' and not request.user.is_authenticated:
            if 'email' not in request.session:
                request.session['email'] = ''
                request.session['provider']=''
                request.session['is_active']='False'         
                
        response = self.get_response(request)
        return response

my_adapter.py

from allauth import account
from allauth.socialaccount.adapter import DefaultSocialAccountAdapter

    
    class MySocialAccountAdapter(DefaultSocialAccountAdapter):
    
        def pre_social_login(self, request, sociallogin):
            if request.session['email']=='' and request.session['provider']=='':
                request.session['email']=sociallogin.account.extra_data['email']
                request.request.session['provider']=sociallogin.account.provider
                request.session['is_active']=False
                response = self.get_response(request)
            
            
            elif request.session['email']==sociallogin.account.extra_data['email'] and request.session['provider']!=sociallogin.account.provider:
                 request.session['is_active']=True
                 response = self.get_response(request)      
     
            
            else:
                request.session['is_active']=True
                response = self.get_response(request)
            
            return response

Но после выполнения команды accounts/login/callback возникает следующая ошибка:

AttributeError at /accounts/google/login/callback/. Объект 'WSGIRequest' не имеет атрибута 'request' Метод запроса: GET URL запроса: https://a2d3-110-36-226-234.ngrok.io/accounts/google/login/callback/?state=22U9GJsvDe3e&code=4%2F0AX4XfWg-xpibKpAXe-Bl0Tpj8Un_PLLNZ-seIwyI0QGgOPbJdHZW1Wt87WZoRMztn5Jikg&scope=email+profile+https%3A%2F%2Fwww. googleapis.com%2Fauth%2Fuserinfo.profile+https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fuserinfo.email+openid&authuser=0&prompt=none. Версия Django: 4.0 Тип исключения: AttributeError Значение исключения:
Объект 'WSGIRequest' не имеет атрибута 'request' Exception Location: C:\Users\user\Desktop\project\social\login_app\my_adapter.py, строка 13, in pre_social_login Python Executable: C:\Users\user\AppData\Local\Microsoft\WindowsApps\PythonSoftwareFoundation.Python.3.9_qbz5n2kfra8p0\python.exe Версия Python: 3.9.9

ЛЮБЫЕ ПРЕДЛОЖЕНИЯ, ПОЖАЛУЙСТА?

Вернуться на верх