首页 > 解决方案 > 即使社交帐户存在,也允许用户使用 django-all-auth 注册,然后自动连接两者

问题描述

因此,如果已经存在,我已经能够连接社交帐户(fb 或 google)以连接到本地电子邮件帐户。

但是,我还想要反向功能,即即使存在(google 或 FB)社交帐户,我也希望允许用户注册。目前它说:

{ 用户已使用此电子邮件地址注册}

我在 Django 2.1 中使用 django-all-auth 和 django-rest-auth

标签: django-allauthdjango-rest-auth

解决方案


是的,你可以这么做。您应该能够修改提供的密码重置端点django-rest-auth以设置密码,然后能够登录:

from django.contrib.auth import get_user_model
from django.contrib.auth.forms import PasswordResetForm as DjangoPasswordResetForm
from rest_auth.serializers import (
    PasswordResetSerializer as RestAuthPasswordResetSerializer
)
from rest_auth.views import PasswordResetView as RestAuthPasswordResetView

UserModel = get_user_model()


class PasswordResetForm(DjangoPasswordResetForm):
    def get_users(self, email):
        """
        Given an email, return matching user(s) who should receive a reset.
        """
        active_users = UserModel._default_manager.filter(**{
            '%s__iexact' % UserModel.get_email_field_name(): email,
            'is_active': True,
        })
        return iter(active_users)
        # or (u for u in active_users if not u.has_usable_password())


class PasswordResetSerializer(RestAuthPasswordResetSerializer):
    password_reset_form_class = PasswordResetForm


class PasswordResetView(RestAuthPasswordResetView):
    serializer_class = PasswordResetSerializer

您可以将此视图添加到您的urls.py作为通用端点以重置密码(请记住将其放在rest_auths 的 URL 前面)或作为附加端点来设置密码(请参阅注释行)。然后,您可以向您的注册页面添加一条注释,该注释链接到为您的新端点提供服务的页面。

作为替代方案,您还可以在用户设置页面中添加一个字段,用户可以在其中设置密码。

send_confirmation当用户尝试注册并且电子邮件已经存在(或仅在此用户拥有社交帐户的情况下)时,您还可以发送带有链接的电子邮件以设置密码。如果您愿意,我可以在这里添加一个示例如何做到这一点。


推荐阅读