11

我是 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 更容易设置

任何帮助将非常感激。

4

3 回答 3

17

回答我自己的问题-

您想要做的是在用户通过社交帐户提供商的身份验证之后并在他们可以继续访问他们的个人资料页面之前停止登录。您可以使用

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'))

这不是一个精确的实现,但类似这样的工作。

于 2013-10-07T18:49:26.520 回答
2

这是一个替代解决方案:

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'
于 2020-04-01T18:00:52.650 回答
0

您可以在注册过程中覆盖 allauth 的 allauth.socialaccount.forms.SignupForm 并检查域。Discalmer:这都是在没有测试的情况下编写的,但是应该可以使用。

# 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

在您的网址中覆盖 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/$”,重新检查一下。

于 2013-10-03T08:40:15.037 回答