Django-allauth - при регистрации новых пользователей через интеграцию с Microsoft срабатывает «No exception message supplied».

Я работаю над интеграцией с использованием django-allauth с Microsoft (EntraID) для обеспечения SSO, и она хорошо работает для существующих пользователей, их учетные записи сопоставляются по адресу электронной почты, однако, когда новый пользователь проходит через поток, я получаю следующее исключение No exception message supplied, которое поднимается site-packages/allauth/account/utils.py, line 227, in setup_user_email, поднятое во время allauth.socialaccount.providers.oauth2.views.view. Если тот же пользователь снова проходит через поток входа в систему SSO, то все работает, поскольку учетная запись совпадает, и он проходит через него.

Ниже приведена комбинация конфигурационных настроек, которые у меня есть в settings.py, само приложение настраивается через Django Admin

SOCIALACCOUNT_PROVIDERS = {
    "microsoft": {
        "APPS": [],
        "EMAIL_AUTHENTICATION": True,
        "VERIFIED_EMAIL": True,
    }
}
ACCOUNT_LOGIN_METHODS = {"email"}
ACCOUNT_SIGNUP_FIELDS = ["email*"]
ACCOUNT_EMAIL_VERIFICATION = "none"
ACCOUNT_DEFAULT_HTTP_PROTOCOL = "https"

SOCIALACCOUNT_AUTO_SIGNUP = True 
SOCIALACCOUNT_EMAIL_AUTHENTICATION = True
SOCIALACCOUNT_LOGIN_ON_GET = True
SOCIALACCOUNT_EMAIL_AUTHENTICATION_AUTO_CONNECT = True
SOCIALACCOUNT_EMAIL_REQUIRED = True

Я установил вышеуказанные настройки, основываясь на следующих двух страницах настроек (https://docs.allauth.org/en/latest/account/configuration.html и https://docs.allauth.org/en/latest/socialaccount/configuration.html ) и исходя

из моего понимания, что эти комбинации настроек должны обеспечить сопоставление существующих учетных записей по адресу электронной почты, автоматическую авторизацию пользователя при сопоставлении и автоматическое создание новых учетных записей без показа формы регистрации и без отправки дополнительной проверки электронной почты. Похоже, что все это происходит, но исключение срабатывает, когда кажется, что это ошибка.<<<5>>>.

При попытке отладки я обнаружил, что строка, вызывающая исключение, имеет вид assert not EmailAddress.objects.filter(user=user).exists() # nosec, что странно, поскольку учетная запись пользователя Django, EmailAddress и запись SocialAccount были созданы правильно.

Я добавил регистрацию в allauth.account.utils и подтвердил, что EmailAddress.objects.filter(user=user).count() == 1 в тот момент, когда вызывается функция setup_user_email. что означает, что утверждение никогда не пройдет, поскольку запись EmailAddress уже была создана.

У кого-нибудь работает SSO с Microsoft EntraID, где новые аккаунты автоматически создаются, когда пользователи возвращаются? Если да, то какие настройки вы установили и/или пришлось ли вам подклассифицировать DefaultSocialAccountAdapter, чтобы перегрузить метод save_user для передачи connect=False

Подробности о версии:

<<<0>>>Python: 3.12 Django: 5.1.7 django-allauth Версия: 65.5.0

Update Следует отметить, что поток работает как ожидалось, если я подклассифицирую DefaultSocialAccountAdapter и принудительно включу connect=True в вызов сохранения

class CustomSocialAccountAdapter(DefaultSocialAccountAdapter):
    """Overloading the adapter to force the connect=True"""

    def save_user(self, request, sociallogin, form=None):
        """
        Saves a newly signed up social login. In case of auto-signup,
        the signup form is not available.
        """
        u = sociallogin.user
        u.set_unusable_password()
        if form:
            get_account_adapter().save_user(request, u, form)
        else:
            get_account_adapter().populate_username(request, u)
        sociallogin.save(request, connect=True)
        return u
Вернуться на верх