Django allauth 社交登录(Google OAuth 2)- 限制域名列表

3
我已经使用django-allauth实现了社交登录(provider-google)功能,但我希望仅允许应用程序的有限域名。以下是我的allauth设置。

settings.py

AUTHENTICATION_BACKENDS = (
    'django.contrib.auth.backends.ModelBackend',
    'allauth.account.auth_backends.AuthenticationBackend',
)
SOCIALACCOUNT_ADAPTER = 'mbaweb.socialaccount_adapter.NoNewUsersAccountAdapter'

LOGIN_REDIRECT_URL = "/"

SOCIALACCOUNT_PROVIDERS = {
    'google': {
        'SCOPE': [
            'profile',
            'email',
        ],
        'AUTH_PARAMS': {
            'access_type': 'online',
            'hd': 'abc.com'
        }
    }
}

通过使用“hd”参数,我可以允许只有“abc.com”域名的帐户。它限制了所有其他域名的帐户。
但我的要求是允许应用程序使用一个域名列表。
例如:allowed_domains = ['abc.com','xyz.co.in','pqr.com']
有什么方法可以实现这个要求吗?
感谢任何帮助。

你可以在settings.py中使用ALLOWED_HOSTS = ['abc.com', 'def.com', ...] - Satendra
谷歌特定的,所有认证配置:http://django-allauth.readthedocs.io/en/latest/providers.html#google我认为,从AUTH_PARAMS中删除hd键应该可以解决您的问题。 - Piyush Das
1
如果我移除hd,它将允许应用程序的所有域名。 - aprasanth
1个回答

5
我采用的方法是编写自定义的 SocialAccountAdapter,在某些情况下返回 is_open_for_signup 的 false 值。
在设置中添加以下内容:
SOCIALACCOUNT_ADAPTER = 'myapp.auth.adapters.SocialAccountAdapter'

显然,更改路径 myapp.auth 以适应您的代码。

在适当的 adapters.py 文件中,添加类似以下内容:

from allauth.socialaccount.adapter import DefaultSocialAccountAdapter


def email_domain(email):
    """Extracts the domain from an email address.

    Warning: this is simplified and you may want a true email address parser.
    """
    return email.split('@')[-1]


# Note: this would be better in settings.py
allowed_signup_domains = [
    'abc.com',
    'seconddomain.com',
    'etcetc.com',
]


class SocialAccountAdapter(DefaultSocialAccountAdapter):

    def is_open_for_signup(self, request, sociallogin):
        if email_domain(sociallogin.user.email) not in allowed_signup_domains:
            return False
        return super(SocialAccountAdapter, self).is_open_for_signup(request, sociallogin)

这种方法并不完美,但可以完成工作,并给用户带来了某种程度上的“优雅”失败。

我现在正在使用相同的方法。它会显示错误消息,但用户将登录到帐户中。如果用户想要使用其他帐户登录,则必须手动转到已登录的帐户并注销。然后使用不同的帐户登录。此外,一旦我们收到错误消息,URL 将是 OAuth2 回调 URL。如果用户刷新页面,这将导致更多混乱。 - aprasanth
1
我想在用户登录到无效帐户之前控制这个。 - aprasanth
我已重新测试以确保,我确认当 is_open_for_signup() 方法返回 False 时,用户未登录且没有为该用户创建任何帐户。他们会停在回调 URL 上,如果重新加载该页面,则会显示“社交网络失败”。不是完美优雅,但功能和清晰。 - Andrew E

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