Django-allauth: перенаправление при входе на страницу регистрации, если существует социальный аккаунт
Я хочу создать метод аутентификации Google Login в моем проекте Django. Таким образом, когда пользователь впервые заходит на мой сайт, он будет создавать нового пользователя в моей базе данных, а затем входить в нее. В случае если пользователь с таким адресом электронной почты уже существует, он просто войдет в систему.
Первая часть моей цели работает как ожидалось (когда пользователь впервые посещает мой сайт, он создает нового пользователя в моей базе данных и затем входит в систему), но если я пытаюсь войти как существующий пользователь, django-allauth перенаправляет меня на /accounts/social/signup/
Я пытался исправить это с помощью CustomSocialAccountAdapter, но это мне не очень помогло. Не могли бы вы помочь мне решить мою проблему?
Вот мой settings.py
:
# allauth
AUTHENTICATION_BACKENDS = [
"django.contrib.auth.backends.ModelBackend",
"allauth.account.auth_backends.AuthenticationBackend",
]
SOCIALACCOUNT_PROVIDERS = {
"google": {
"APP": {
"client_id": os.environ.get("GOOGLE_CLIENT_ID", ""),
"secret": os.environ.get("GOOGLE_CLIENT_SECRET", ""),
},
"SCOPE": [
"profile",
"email",
],
"AUTH_PARAMS": {
"access_type": "offline",
},
},
}
ACCOUNT_LOGIN_REDIRECT_URL = "home"
ACCOUNT_LOGOUT_REDIRECT_URL = "home"
SOCIALACCOUNT_LOGIN_ON_GET = True
SOCIALACCOUNT_LOGOUT_ON_GET = True
ACCOUNT_AUTHENTICATION_METHOD = "email"
ACCOUNT_EMAIL_REQUIRED = True
ACCOUNT_USERNAME_REQUIRED = False
ACCOUNT_UNIQUE_EMAIL = True
ACCOUNT_USER_MODEL_USERNAME_FIELD = None
SOCIALACCOUNT_AUTO_SIGNUP = True
ACCOUNT_LOGOUT_ON_GET = True
SOCIALACCOUNT_ADAPTER = "user.adapters.CustomSocialAccountAdapter"
Мой adapters.py
:
class CustomSocialAccountAdapter(DefaultSocialAccountAdapter):
def pre_social_login(self, request, sociallogin):
user = sociallogin.user
if not CustomUser.objects.filter(email=user.email).exists():
extra_data = sociallogin.account.extra_data
user.first_name = extra_data.get('given_name')
user.last_name = extra_data.get('family_name')
user.is_active = True
user.save()
else:
perform_login(request, user, 'none')
return super().pre_social_login(request, sociallogin)
Мой HTML-код:
<a
class="login-social__link"
href="{% provider_login_url 'google' process='login' method='oauth2'>
<svg class="login__icon login-google">
<use
xlink:href="{% static 'images/sprite-icons.svg' %}#icon-google"
></use>
</svg>
</a>
Пробовали ли вы ChatGPT или документацию?
Я просто изменил adapters.py
следующим образом:
from allauth.account.models import EmailAddress
def pre_social_login(self, request, sociallogin):
try:
user = CustomUser.objects.get(email=sociallogin.user.email)
sociallogin.connect(request, user)
email_address, created = EmailAddress.objects.get_or_create(user=user, email=user.email)
if not email_address.verified:
email_address.verified = True
email_address.primary = True
email_address.save()
...
except CustomUser.DoesNotExist:
...
Когда пользователь пытается войти в систему через социальный аккаунт, и его email совпадает с email, уже имеющимся в базе данных, django-allauth пытается связать социальный аккаунт с существующим аккаунтом пользователя. Если это не удается сделать автоматически (например, из-за отсутствия или несовпадения данных), то в качестве запасного варианта происходит перенаправление на страницу регистрации.