Django-allauth: перенаправление при входе на страницу регистрации, если существует социальный аккаунт

Я хочу создать метод аутентификации Google Login в моем проекте Django. Таким образом, когда пользователь впервые заходит на мой сайт, он будет создавать нового пользователя в моей базе данных, а затем входить в нее. В случае если пользователь с таким адресом электронной почты уже существует, он просто войдет в систему.

Первая часть моей цели работает как ожидалось (когда пользователь впервые посещает мой сайт, он создает нового пользователя в моей базе данных и затем входит в систему), но если я пытаюсь войти как существующий пользователь, django-allauth перенаправляет меня на /accounts/social/signup/

enter image description here

Я пытался исправить это с помощью 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 пытается связать социальный аккаунт с существующим аккаунтом пользователя. Если это не удается сделать автоматически (например, из-за отсутствия или несовпадения данных), то в качестве запасного варианта происходит перенаправление на страницу регистрации.

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