Django REST Framework Проблемы с доступом к аутентификации
У меня возникли проблемы с аутентификацией. Я опишу свою проблему в шагах, которые я сделал, чтобы помочь вам лучше понять, что за проблема у меня возникла. Я новичок в Django, поэтому мой код может выглядеть как мусор.
Сначала я создаю пользователя, используя свою пользовательскую модель пользователя.
class CustomUserManager(BaseUserManager):
def create_user(self, email, username, password=None, **extra_fields):
if not email:
raise ValueError('The email field must be set')
email = self.normalize_email(email)
user = self.model(email=email, username=username, **extra_fields)
user.set_password(password)
user.save(using=self._db)
return user
class CustomUser(AbstractUser, PermissionsMixin):
email = models.EmailField(unique=True)
password = models.CharField(max_length=128)
username = models.CharField(max_length=30, unique=True)
avatar = models.ImageField(upload_to='avatars/', null=True, blank=True)
# Это поле определяет, активен ли пользователь (False - учетная запись деактивирована)
is_active = models.BooleanField(default=True)
# Это поле указывает, является ли пользователь членом персонала (в нашем случае - бустером)
is_staff = models.BooleanField(default=False)
objects = CustomUserManager()
# Это поле определяет, какое поле будет использоваться для входа в систему вместо стандартного username
USERNAME_FIELD = 'email'
# Список полей, которые будут требоваться для создания пользователя с помощью команды createsuperuser
REQUIRED_FIELDS = ['username']
def __str__(self):
return self.email
Я использую этот url, view и serializer для создания нового пользователя
path('api/v1/register/', UserRegistrationView.as_view(), name='user-registration'),
class UserRegistrationView(CreateAPIView):
serializer_class = UserRegistrationSerializer
permission_classes = [permissions.AllowAny]
def create(self, request, *args, **kwargs):
serializer = self.serializer_class(data=request.data)
serializer.is_valid(raise_exception=True)
user = serializer.save()
return Response({
'user': serializer.data,
})
class UserRegistrationSerializer(serializers.ModelSerializer):
password = serializers.CharField(write_only=True)
class Meta:
model = CustomUser
fields = ['username', 'password', 'email']
def create(self, validated_data):
user = CustomUser.objects.create(
username=validated_data['username'],
email=validated_data['email']
)
user.set_password(validated_data['password'])
user.save()
return user
После этого я убедился, что таблица в базе данных создана. Таблица называется 'users_customuser'. В таблице есть поле "last_login" со значением NULL для моего нового пользователя. После этого я пытаюсь войти в систему. Я использую djoser, поэтому у меня есть эти url и эти настройки:
path('auth/', include('djoser.urls')),
re_path(r'^auth/', include('djoser.urls.authtoken')),
REST_FRAMEWORK = {
'DEFAULT_PERMISSION_CLASSES': (
'rest_framework.permissions.IsAuthenticated',
),
'DEFAULT_AUTHENTICATION_CLASSES': (
'rest_framework.authentication.TokenAuthentication',
),
}
INSTALLED_APPS = [
'django.contrib.auth',
'django.contrib.admin',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'corsheaders',
'rest_framework',
'rest_framework.authtoken',
'djoser',
'products',
'users'
]
У меня также есть таблица "authtoken_token" в базе данных.
Я выполняю вход с помощью url http://localhost:8000/auth/token/login, куда отправляю email пользователя и пароль пользователя. Я делаю это через "Postman" и получаю ответ с моим access_token. Этот токен я могу увидеть в таблице "authtoken_token" с user_id моего пользователя рядом с ним. Также, после успешного входа, я вижу, что значение "last_login" моего пользователя в таблице "users_customuser" изменилось, оно больше не NULL, я вижу там дату и время последнего входа. Это хорошо, но когда я пробую этот url с этим представлением и сериализатором:
path('api/v1/user_view', UserView.as_view(), name='user-view'),
class UserView(CreateAPIView):
permission_classes = [IsAuthenticated]
serializer_class = UserSerializer
def get(self, request, *args, **kwargs):
return Response('hello!', status=status.HTTP_200_OK)
class UserSerializer(serializers.ModelSerializer):
class Meta:
model = CustomUser
fields = ['email']
я получаю ошибку 401 с таким кодом:
{
"detail": "Authentication credentials were not provided."
}
Я получаю этот код при отправке:
{
"email": "dmitry@yandex.ru",
"Authorization": "Token 701751147914c580f45640346e5f07a873c16b14"
}
Это на 100% правильный токен и на 100% правильная электронная почта. Я не знаю, что делать и как это исправить.
Я пытался отправить
{
"email": "dmitry@yandex.ru",
"Authorization": "Token 701751147914c580f45640346e5f07a873c16b14"
}
И получаем "hello" со статусом 200.
A попытался отправить
{
"email": "dmitry@yandex.ru",
"headers": {
"Authorization": "Token 701751147914c580f45640346e5f07a873c16b14"
}
}
i also tried to send it with username. Every time i get 401 error.