无法使用用户名/密码登录到令牌端点:drf令牌身份验证和自定义用户模型Django



我有一个使用Django rest框架的基本Django应用程序,一个从默认继承的自定义用户模型,以及基本的令牌身份验证。我可以通过运行python3 ./manage.py drf_create_token {USERNAME/EMAIL}为任何用户生成令牌,并使用它对相关请求进行身份验证。然而,当我尝试到达我的令牌端点(在本例中为http://127.0.0.1:8000/api/token/,或部署的应用程序的等效端点(时,我会得到

{
"non_field_errors": [
"Unable to log in with provided credentials."
]
}

我的请求体(application/json(如下:

{
"username": "test@test.com",
"password": "test"
}

我已经确保用户是活跃的;密码正确;并且用户名与电子邮件相同。

我的自定义用户类:

class Customer(AbstractUser):
first_name = models.CharField(max_length=240)
last_name = models.CharField(max_length=240)
email = models.EmailField(unique=True)
phone_number = PhoneNumberField(unique=True)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now_add=True)
is_active=models.BooleanField(default=True)
USERNAME_FIELD = "email"
REQUIRED_FIELDS = ["password", "phone_number", "first_name", "last_name", "username"]
def __str__(self):
return f"{self.first_name} {self.last_name}"

相关网址:

urlpatterns = [
path('admin/', admin.site.urls),
path('api/users/', include('customer.urls')),
path('api/token/', obtain_auth_token, name="auth_token"),
]

在设置中。我有以下内容:

INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'django_extensions',
'phonenumber_field',
'customer',
'contact',
'rest_framework',
'rest_framework.authtoken',
]
...
REST_FRAMEWORK = {
'DEFAULT_SCHEMA_CLASS': 'rest_framework.schemas.coreapi.AutoSchema',
'DEFAULT_AUTHENTICATION_CLASSES': [
'rest_framework.authentication.TokenAuthentication',
],
}
...
AUTH_USER_MODEL = 'customer.Customer'
...

我的序列化程序(这里的联系人是另一个模型(:

class CustomerSerializer(serializers.ModelSerializer):
contacts = serializers.SerializerMethodField()
def get_contacts(self, obj):
from contact.serializers import ContactSerializer
from contact.models import Contact
return ContactSerializer(Contact.objects.filter(user=obj), many=True, read_only=True).data
class Meta:
model = Customer
fields = [
'pk', 
'first_name', 
'last_name',
'email', 
'phone_number', 
'created_at', 
'updated_at',
'contacts',
]

我会错过什么?我已经尝试了这里的所有解决方案:DRF auth_token:";non_field_errors":["无法使用提供的凭据登录。">

我发现了以下问题https://docs.djangoproject.com/en/4.0/topics/auth/customizing/#a-完整的示例我看到,对于自定义用户模型,您必须更新创建这些自定义用户的方式(通过admin、auth或其他方式(,以确保密码被正确散列。接下来,我创建了一个自定义管理表单和一个自定义用户管理器,它正确地覆盖和处理模型的保存:

def create_user(self, email, first_name, last_name, phone_number, password=None):
"""
Creates and saves a User with the given email and password.
"""
if not email:
raise ValueError('Users must have an email address')
user = self.model(
email=self.normalize_email(email),
first_name=first_name,
last_name=last_name,
phone_number=phone_number,
)
user.set_password(password)
user.save(using=self._db)
return user

最新更新