I have my Authentication System backend on Django and Frontend on React. I was trying to implement a new API endpoint and suddenly my authentication system is not working (Auth system made with Djoser).
I can assure you that before moving on to the new API I tested the Authentication System API's with POSTMAN and everything worked fine. I am using postgres db. I pulled a git commit from history that worked for sure, and still not working. One of my friends is a collaborator and for him is working, he force pushed and overwritten everything but for me for some reason it doesn't work anymore. When trying to Sign Up (or Login) I get this error
POST /auth/users/ HTTP/1.1" 400 29
POST /auth/users/activation/ HTTP/1.1" 400 50
POST /auth/jwt/create/ HTTP/1.1" 401 63
Here is my 2 models
from django.db import models
from django.db.models.signals import post_save
from django.contrib.auth.models import AbstractBaseUser, PermissionsMixin, BaseUserManager
from django.dispatch import receiver
# Create your models here.
class UserAccountManager(BaseUserManager):
def create_user(self, email, name, password=None):
if not email:
raise ValueError('Users must have an email address')
email = self.normalize_email(email)
user = self.model(email=email, name=name)
user.set_password(password)
user.save()
return user
class UserAccount(AbstractBaseUser, PermissionsMixin):
email = models.EmailField(max_length=255, unique=True)
name = models.CharField(max_length=255)
is_active = models.BooleanField(default=True)
is_staff = models.BooleanField(default=False)
objects = UserAccountManager()
USERNAME_FIELD = 'email'
REQUIRED_FIELDS = ['name']
def get_full_name(self):
return self.name
def get_short_name(self):
return self.name
def __str__(self):
return self.email
########################################
class UserProfile(models.Model):
user = models.OneToOneField(UserAccount, on_delete=models.CASCADE)
height = models.PositiveIntegerField(default=0) # in cm
weight = models.PositiveIntegerField(default=0) # in kg
GENDER_CHOICES = (
('M', 'Male'),
('F', 'Female'),
)
gender = models.CharField(default=0, max_length=1, choices=GENDER_CHOICES)
age = models.PositiveIntegerField(default=0)
GOAL_CHOICES = (
('M', 'Maintain weight'),
('L', 'Lose weight'),
('G', 'Gain weight'),
)
goal = models.CharField(default=0, max_length=1, choices=GOAL_CHOICES)
@receiver(post_save, sender=UserAccount)
def create_user_profile(sender, instance, created, **kwargs):
if created:
UserProfile.objects.create(user=instance)
post_save.connect(create_user_profile, sender=UserAccount)
Serializers
from djoser.serializers import UserCreateSerializer
from django.contrib.auth import get_user_model
from rest_framework import serializers
from .models import UserProfile
User = get_user_model()
class UserCreateSerializer(UserCreateSerializer):
class Meta(UserCreateSerializer.Meta):
model = User
fields = ('id', 'email', 'name', 'password')
class UserProfileSerializer(serializers.ModelSerializer):
class Meta:
model = UserProfile
fields = ['user', 'height', 'weight', 'gender', 'age', 'goal']
And views
from django.shortcuts import render
from rest_framework import generics
from .models import UserProfile
from .serializers import UserProfileSerializer
from .permissions import IsUserOrReadOnly
from rest_framework.exceptions import PermissionDenied
class UserProfileView(generics.RetrieveUpdateAPIView):
serializer_class = UserProfileSerializer
lookup_field = 'user'
permission_classes = [IsUserOrReadOnly]
def get_object(self):
if self.request.user.is_authenticated:
return UserProfile.objects.get(user=self.request.user)
raise PermissionDenied({"message": "You must be logged in."})