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