"detail": "Учетные данные для аутентификации не были предоставлены." drf

Я занимаюсь проектом для домашних животных. И мне нужно сделать так, чтобы только авторизованные пользователи могли делать POST/PATCH запросы, и чтобы только владельцы предметов могли их изменять/удалять.

views.py(item_app)

class CreateItemView(APIView):

    serializer_class = CreateItemSerializer
    authentication_classes=[OwnAuthentication]
    permission_classes=[IsAuthenticatedOrReadOnly, IsOnwerOrReadOnly]
                       ... code ...

permissions.py(item_app)

from rest_framework import permissions


class IsOnwerOrReadOnly(permissions.BasePermission):
    def has_object_permission(self, request, view, obj):
        if request.method in permissions.SAFE_METHODS:
            return True
        return obj.owner == request.user

authentication.py(auth_app)

from django.contrib.auth.models import User
from rest_framework import authentication
from rest_framework import exceptions

class OwnAuthentication(authentication.BaseAuthentication):
    def authenticate(self, request):
            username = request.data.get('username')
            if not username:
                  return None
            try:
                  user= User.object.get(username=username)
            except User.DoesNotExist:
                  raise exceptions.AuthenticationFailed('No such user')
            return (user, None)

settings.py


AUTH_USER_MODEL = "auth_app.Users"

REST_FRAMEWORK = {
    'DEFAULT_PARSER_CLASSES':[
        'rest_framework.parsers.JSONParser',
    ],
    'DEFAULT_AUTHENTICATION_CLASSES': [
        'rest_framework_simplejwt.authentication.JWTAuthentication',
    ],
}

[Авторизация осуществляется через JWT-токены, при входе я получаю токен доступа, копирую его и вставляю в заголовок "Authorization" в postman, и когда я включаю этот заголовок, все равно возникает ошибкаenter image description here]1

В вашем файле settings.py , JWTAuthentication установлен в качестве класса аутентификации по умолчанию.


REST_FRAMEWORK = {
    ...
    'DEFAULT_AUTHENTICATION_CLASSES': [
        'rest_framework_simplejwt.authentication.JWTAuthentication',
    ],
}

Однако, если вы посмотрите на последнюю часть вашего вопроса, там говорится, что используется аутентификация JWT, но CreateItemView использует другой класс аутентификации.

class CreateItemView(APIView):

    serializer_class = CreateItemSerializer
    # authentication_classes=[OwnAuthentication]
    permission_classes=[IsAuthenticatedOrReadOnly, IsOnwerOrReadOnly]

Чтобы использовать класс сертификации JWT для CreateItemView, очистите authentication_classes.

А чтобы применить несколько классов разрешений, нужно использовать оператор bit.

class CreateItemView(APIView):

    serializer_class = CreateItemSerializer
    authentication_classes=[OwnAuthentication]
    permission_classes=[IsAuthenticatedOrReadOnly|IsOnwerOrReadOnly]
    # or
    permission_classes=[IsAuthenticatedOrReadOnly&IsOnwerOrReadOnly]

Наконец, если посмотреть на последнюю картинку, которую вы предоставили, то в переданном значении не был указан тип токена. В вашем проекте используется JWT-аутентификация, вам нужно добавить 'Bearer' в начало и указать access_token.

Авторизация: 'Bearer {access_token}'

Вернуться на верх