DefaultSocialAccountAdapter 覆盖 pre_social_login

DefaultSocialAccountAdapter overrriding pre_social_login

我正在尝试在通过 google 帐户登录或注册之前验证电子邮件地址。

我有以下代码:

from django.http import Http404
from allauth.socialaccount.adapter import DefaultSocialAccountAdapter

class MySocialAccountAdapter(DefaultSocialAccountAdapter):

def pre_social_login(self, request, sociallogin):
    email_domain = sociallogin.account.user.email.split('@')[1].lower()
    if email_domain == 'mysuperdomain.org':
        print email_domain
        pass

当我登录时它工作正常(google 帐户已经存在于 Django 中)但是当第一次尝试 singup 时我有以下错误:

RelatedObjectDoesNotExist 在 /accounts/google/login/callback/ SocialAccount 没有用户。

任何智慧将不胜感激。

谢谢,

J

好的,下面的信号代码有一些进展:

    from allauth.account.signals import user_signed_up
    from django.http import Http404
    from auth.settings import ALLOWED_DOMAIN


    def email_allowed(user, **kwargs):
        email_domain = user.email.split('@')[1].lower()
        if not email_domain == ALLOWED_DOMAIN:
            raise Http404

    user_signed_up.connect(email_allowed)

但仍需要采取一些措施来防止在不允许域时添加用户帐户。

要避免 "SocialAccount has no user" 错误,请尝试使用 sociallogin.user 而不是 sociallogin.account.user。此外,您可能希望将电子邮件验证逻辑放在自定义适配器的 clean_email 方法中。

感谢@pennersr 的帮助。

我得到了以下代码:

class KcSocialAccountAdapter(DefaultSocialAccountAdapter):
def pre_social_login(self, request, sociallogin):
    email_domain = sociallogin.user.email.split('@')[1].lower()
    if not email_domain == ALLOWED_DOMAIN:
        raise ImmediateHttpResponse(HttpResponse(sociallogin.user.email + ' is not valid memeber of ' +ALLOWED_DOMAIN))
    else:
        pass