django-allauth: 仅允许来自特定 Google Apps 域的用户

12

我是Django的新手。使用django-allauth,我已经设置了单击登录。我从Google API控制台获得了我的域凭据(client_id和secret_key)。但问题在于django-allauth允许我从任何Google帐户登录,而我希望将电子邮件地址限制为我的域名(@example.com而不是@gmail.com)

django-social-auth有白名单域参数以实现此功能,我该如何在allauth中包含这些信息?在花费数小时在django-social-auth上后,我发现django-allauth要容易得多。

非常感谢您的任何帮助。

3个回答

18

回答自己的问题 -

您想要做的是,当用户通过社交帐户提供程序进行身份验证并在他们可以继续访问其个人资料页面之前暂停登录。您可以使用 allauth/socialaccount/adaptor.py 中的 DefaultSocialAccountAdapter 类的 pre_social_login 方法来实现此操作。

在用户成功通过社交提供商进行身份验证后但在实际处理登录(以及发出 pre_social_login 信号)之前调用。 您可以使用此挂钩进行干预,例如通过引发 ImmediateHttpResponse 来中止登录。 为什么需要一个适配器挂钩和信号? 在信号处理程序中内部干预流程很糟糕--可能存在多个处理程序并且以未确定的顺序执行。

做一些像这样的事情

from allauth.socialaccount.adaptor import DefaultSocialAccountAdapter

class MySocialAccount(DefaultSocialAccountAdapter):
    def pre_social_login(self, request, sociallogin):
        u = sociallogin.account.user
        if not u.email.split('@')[1] == "example.com"
            raise ImmediateHttpResponse(render_to_response('error.html'))

这不是准确的实现,但类似这样的方法可以奏效。


1
在创建自定义适配器后,根据插件文档中的配置部分,将其注册到settings.SOCIALACCOUNT_ADAPTER - Matt
5
作为日后参考,我发现必须使用u = sociallogin.user,否则如果用户以前不存在,就会出现错误。 - Desh__

3
这里有一个替代方案:
from allauth.account.adapter import DefaultAccountAdapter
from allauth.socialaccount.adapter import DefaultSocialAccountAdapter

class CustomAccountAdapter(DefaultAccountAdapter):
    def is_open_for_signup(self, request):
        return False # No email/password signups allowed

class CustomSocialAccountAdapter(DefaultSocialAccountAdapter):
    def is_open_for_signup(self, request, sociallogin):
        u = sociallogin.user
        # Optionally, set as staff now as well.
        # This is useful if you are using this for the Django Admin login.
        # Be careful with the staff setting, as some providers don't verify
        # email address, so that could be considered a security flaw.
        #u.is_staff = u.email.split('@')[1] == "customdomain.com"
        return u.email.split('@')[1] == "customdomain.com"

这段代码可以放在任何地方,但假设它在mysite/adapters.py中,你还需要在settings.py中添加以下内容:

ACCOUNT_ADAPTER = 'mysite.adapters.CustomAccountAdapter'
SOCIALACCOUNT_ADAPTER = 'mysite.adapters.CustomSocialAccountAdapter'

我尝试了这个解决方案,但我一直在社交账户登录时收到“注册已关闭”的错误信息。我已经设置了 SOCIALACCOUNT_LOGIN_ON_GET = TrueSOCIALACCOUNT_AUTO_SIGN_UP = True - Willy satrio nugroho

0
你可以在覆盖allauth.socialaccount.forms.SignupForm并在注册过程中检查域名方面做些事情。 免责声明:这是没有经过测试的所有写作,但类似这样的东西应该可以工作。
# settings.py
# not necesarry, but it would be a smart way to go instead of hardcoding it
ALLOWED_DOMAIN = 'example.com'

.

# forms.py
from django.conf import settings
from allauth.socialaccount.forms import SignupForm


class MySignupForm(SignupForm):

    def clean_email(self):
        data = self.cleaned_data['email']
        if data.split('@')[1].lower() == settings.ALLOWED_DOMAIN:
            raise forms.ValidationError(_(u'domena!'))
        return data

在您的URL中覆盖allauth默认设置(在包含django-allauth之前放置此设置)

# urls.py

from allauth.socialaccount.views import SignupView
from .forms import MySignupForm


urlpatterns = patterns('',
    # ...
    url(r"^social/signup/$", SignupView.as_view(form_class=MySignupForm), name="account_signup"),
    # ...
)

我不确定“^social/signup/$”是否正确,请重新检查。

1
正确的URL是accounts/social/signup。但这并不起作用。我不想在使用Google登录后显示allauth注册表单。我想要的是,在Google登录后立即将他们重定向到他们的个人资料页面,或者他们会收到一个错误消息,说我们只接受来自example.com域的用户。 - aishpant
我应该使用django-allauth的pre_social_login信号来进行域名匹配吗? - aishpant

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接