Django Social Auth——我无法为通过 Facebook 注册的用户重置密码

Django Social Auth--I Can't Reset Password for User That Signed Up Via Facebook

我遇到了一个非常奇怪的问题,我无法弄清楚。

在我的网站上,我可以选择让用户通过普通注册页面或通过 Facebook 社交身份验证进行注册——我正在为 Python/Django.[=12= 使用社交身份验证应用程序]

用户可以通过任何一种方式注册成功。

如果用户通过正常注册方法注册并输入用户名、电子邮件和密码——如果需要,他们可以通过密码重置页面成功触发密码重置。

但是,如果用户通过 Facebook AUTH 注册,在创建用户个人资料后,如果他们去输入电子邮件以重置密码,则不会生成 EMAIL。

这是我在 settings.py 中对授权应用程序的设置。

AUTH_USER_MODEL = "accounts.User"
SOCIAL_AUTH_USER_MODEL = 'accounts.User'
SOCIAL_AUTH_FACEBOOK_SCOPE = ['email']
SOCIAL_AUTH_FACEBOOK_PROFILE_EXTRA_PARAMS = {
    'fields': 'id,name,email', 
}
SOCIAL_AUTH_SLUGIFY_USERNAMES = True

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

如您所见,我正在修改用户名,因此所有字段都已填充。

这是我的用户模型

class User(AbstractBaseUser, PermissionsMixin):
    email = models.EmailField(unique=True, error_messages={'unique':"This email has already been registered."})
    username = models.CharField(max_length=40, default='')
    first_name = models.CharField(max_length=40, default='', blank=True)
    last_name = models.CharField(max_length=40, default='', blank=True)
    date_joined = models.DateTimeField(default=timezone.now)
    favorites = models.ManyToManyField(Deal, related_name='favorited_by', null=True, blank=True)
    is_active = models.BooleanField(default=True)
    is_staff = models.BooleanField(default=False)

    objects = UserManager()

    USERNAME_FIELD = 'email'
    REQUIRED_FIELDS = ['username']

有人看到我在这里可能遗漏的任何信息——或者为什么这些电子邮件可能不会被触发?

默认情况下,Django 会在用户记录上设置一个不可用的密码,默认情况下,Django 也不允许您重置这些用户密码,为此您需要实现自己版本的重置机制(您应该可以扩展 Django built-in on).

python-social-auth 不处理密码或密码重置。

您需要覆盖 class auth_views.PasswordResetForm 示例的 get_users 方法

class yourOverriding(auth_views.PasswordResetForm):

    def get_users(self, email):
        """Given an email, return matching user(s) who should receive a reset.

        This allows subclasses to more easily customize the default policies
        that prevent inactive users and users with unusable passwords from
        resetting their password.
        """
        active_users = UserModel._default_manager.filter(**{
            '%s__iexact' % UserModel.get_email_field_name(): email,
            'is_active': True,
        })
        d = (u for u in active_users)
        return d