"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}'