Django Social Auth Pipeline - 检查重复的电子邮件

时间:2018-03-30 01:42:37

标签: python django python-social-auth django-socialauth

所以我在这里捎带这个帖子:

Python Social Auth duplicating e-mails for different users

这是我的问题:

我通过常规电子邮件注册,facebook auth或twitter auth为用户提供注册功能。

我也使用相同的包Social Django Auth App作为用户登录页面。

我意识到用户可能尝试使用Facebook帐户注册(与一封电子邮件相关联),然后再次尝试注册Twitter(可能具有相同的电子邮件地址)。基于上述帖子,我添加了一个函数来检查重复的电子邮件,如下所示:

def check_email_exists(request, backend, details, uid, user=None, *args, **kwargs):
    email = details.get('email', '')
    provider = backend.name

    # check if social user exists to allow logging in (not sure if this is necessary)
    social = backend.strategy.storage.user.get_social_auth(provider, uid)
    # check if given email is in use
    count = User.objects.filter(username=email).count()

    success_message = messages.success(request, 'Sorry User With That Email Already Exists')

    # user is not logged in, social profile with given uid doesn't exist
    # and email is in use
    if not user and not social and count:
        return HttpResponseRedirect(reverse('accounts:sign_up', success_message))

和我的管道功能:<​​/ p>

SOCIAL_AUTH_PIPELINE = (
    'social_core.pipeline.social_auth.social_details',
    'social_core.pipeline.social_auth.social_uid',
    'social_core.pipeline.social_auth.auth_allowed',
    'social_core.pipeline.social_auth.social_user',
    'social_core.pipeline.user.get_username',
    'dealmazing.utils.check_email_exists',
    'social_core.pipeline.social_auth.associate_by_email',  # <--- enable this one
    'social_core.pipeline.user.create_user',
    'social_core.pipeline.social_auth.associate_user',
    'social_core.pipeline.social_auth.load_extra_data',
    'social_core.pipeline.user.user_details',
)

UPON测试 - 如果我去注册已注册的电子邮件地址的Twitter帐户 - 它可以工作。 YAY!

但是当我尝试使用Facebook或Twitter登录时,主要问题就出现了。该功能正在检查这些登录,然后将我的电子邮件全部存在。&#39;电子邮件已存在...&#39;错误。

所以我需要在登录和注册之间进行解密,但是我无法通过社交认证包找到我的实际操作方法。

有什么想法吗?

2 个答案:

答案 0 :(得分:0)

登录和注册之间的区别取决于您的项目,看起来在您的场景中,登陆管道功能的用户与数据库中的电子邮件匹配应该被视为login尝试,而不是新单身。这基本上是associate_by_email方法的功能。

当用户使用不验证电子邮件地址的服务时,您可能会发现潜在风险,他们可以控制其他人的帐户。您可以通过在添加任何新社交帐户后进行验证,或者通过信任已知可以验证电子邮件的服务来缓解此问题。

答案 1 :(得分:0)

我想说,你必须从管道中删除

'social_core.pipeline.social_auth.associate_by_email'

原因:您的应用程序不支持 User 数据模型中的唯一用户电子邮件,并且您将陷入困境。如果您不验证用户电子邮件,那么麻烦可能更大。