使用 django 3.1 使用 djoser 进行自定义身份验证

时间:2021-07-21 15:03:32

标签: django django-rest-framework django-rest-auth djoser

我在使我的后端(使用电话号码或电子邮件地址登录)与 djoser 一起登录时遇到问题。它似乎只是登录超级用户帐户,我希望它采用电话号码或电子邮件地址。 ps:后端不是来自 django rest 框架,但我从 vanilla django 创建了一个自定义身份验证。(我在 api 之前创建了完整的项目,以防万一这可能是问题) 我是 API 和 Django 的新手,我希望这是一个相关的问题。

这是我的代码,如果您需要更多,请告诉我,谢谢

我的设置:

DJOSER = {
    'USER_CREATE_PASSWORD_RETYPE':True,
    'USERNAME_CHANGED_EMAIL_CONFIRMATION':True,
    'PASSWORD_CHANGED_EMAIL_CONFIRMATION':True,
    'SEND_CONFIRMATION_EMAIL':True,
    'SET_USERNAME_RETYPE':True,
    'SET_PASSWORD_RETYPE':True,
    'PASSWORD_RESET_CONFIRM_URL':'password/reset/confirm/{uid}/{token}',
    'USERNAME_RESET_CONFIRM_URL':'password/reset/confirm/{uid}/{token}',
    'ACTIVATION_URL':'activate/{uid}/{token}',
    'SEND_ACTIVATION_EMAIL':True,
    'SERIALIZERS': {
        'user_create': 'rafiki.serializers.UserCreateSerializer',
        'user': 'rafiki.serializers.UserCreateSerializer',
        'user_delete': 'djoser.serializers.UserDeleteSerializer',
    }

}

我的身份验证模型:

class CustomUserManager(BaseUserManager):
    """
    Custom user model manager where Email_Address is the unique identifiers
    for authentication instead of usernames.
    """
    def create_user(self, Email_Address, password,   **extra_fields):
        """
        Create and save a User with the given Email_Address and password.
        """
        if not Email_Address:
            raise ValueError(_('The Email_Address must be set'))
        Email_Address = self.normalize_email(Email_Address)
        user = self.model(Email_Address=Email_Address, **extra_fields)
        user.set_password(password)
        user.save()
        return user

    def create_superuser(self, Email_Address, password, **extra_fields):
        """
        Create and save a SuperUser with the given Email_Address and password.
        """
        extra_fields.setdefault('is_staff', True)
        extra_fields.setdefault('is_superuser', True)
        extra_fields.setdefault('is_active', True)

        if extra_fields.get('is_staff') is not True:
            raise ValueError(_('Superuser must have is_staff=True.'))
        if extra_fields.get('is_superuser') is not True:
            raise ValueError(_('Superuser must have is_superuser=True.'))
        return self.create_user(Email_Address, password, **extra_fields)


class Customer(AbstractUser):
    username = None
    Phone_number = models.CharField(max_length=15, blank=True)
    Email_Address = models.EmailField(unique=True)


    USERNAME_FIELD = 'Email_Address'
    REQUIRED_FIELDS = []

    objects = CustomUserManager()

    class Meta:
        verbose_name = 'Customer'
        verbose_name_plural = 'Customers'

认证类:

from django.contrib.auth import get_user_model
from django.contrib.auth.backends import BaseBackend
from store.models import Customer
from django.db.models import Q




class MyBackend(BaseBackend):

    def authenticate(self, request, username=None, password=None):
        try:
            user = Customer.objects.get(
                Q(Phone_number=username) | Q(Email_Address=username)
            )
            pwd_valid = user.check_password(password)
            if pwd_valid:
                return user
            return None
        except user.DoesNotExist:
            return None

    def get_user(self, user_id):
        try:
            return Customer.objects.get(pk=user_id)
        except Customer.DoesNotExist:
            return None

0 个答案:

没有答案