django-rest-auth - Facebook社交登录会针对现有电子邮件引发唯一约束违规

时间:2018-01-09 15:15:20

标签: django django-rest-framework facebook-login django-allauth django-rest-auth

我使用django-allauth和django-rest-auth实现了注册和登录。我可以通过allauth和rest-auth(网络和移动)成功登录Facebook到服务器。

当我尝试使用FB帐户登录时,其电子邮件已经存在(某人已经使用该电子邮件注册),它会显示注册表单。但是,当我尝试使用rest-auth做同样的事情时,我收到一个错误:

Internal Server Error: /rest-auth/facebook/

IntegrityError at /rest-auth/facebook/
duplicate key value violates unique constraint "auth_user_username_key"
DETAIL:  Key (username)=() already exists.

我的配置:

ACCOUNT_USERNAME_REQUIRED = False
ACCOUNT_AUTHENTICATION_METHOD = 'email'
ACCOUNT_EMAIL_REQUIRED = True
ACCOUNT_EMAIL_VERIFICATION = 'optional'
SOCIALACCOUNT_AUTO_SIGNUP = True
SOCIALACCOUNT_EMAIL_VERIFICATION = False
SOCIALACCOUNT_EMAIL_REQUIRED = True
SOCIALACCOUNT_QUERY_EMAIL = True

2 个答案:

答案 0 :(得分:3)

我通过创建将现有帐户连接到社交帐户的社交适配器解决了这个问题。 在使用之前,请确保您已了解风险 - 如果未在其中一个帐户中验证电子邮件地址,则恶意用户可能会在社交注册之前通过注册来控制帐户(例如)。 / p>

class MySocialAccountAdapter(DefaultSocialAccountAdapter):
    def pre_social_login(self, request, sociallogin):

        user = sociallogin.user
        if user.id:
            return
        if not user.email:
            return

        try:
            user = User.objects.get(email=user.email)  # if user exists, connect the account to the existing account and login
            sociallogin.connect(request, user)
        except User.DoesNotExist:
            pass
        except Exception as e:
            logger.exception('Social adapter failure - {}'.format(e))

您需要在settings.py中设置适配器的路径:

SOCIALACCOUNT_ADAPTER = 'path.to.MySocialAccountAdapter'

答案 1 :(得分:2)

django-rest-auth v0.9.3的最新版本现在包含社交连接视图,您可以将现有帐户与社交帐户相关联。

为了使用它们,您需要通过现有帐户进行身份验证,因为上一个答案中列出了安全问题。更多信息请参阅文档:Additional Social Connect Views

唯一约束500错误也已修复。