Используя 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
ЛЮБЫЕ ПРЕДЛОЖЕНИЯ, ПОЖАЛУЙСТА?