“detail”:“未提供身份验证凭据。” drf

问题描述 投票:0回答:1

我正在做一个宠物项目。我需要确保只有授权用户才能发出 POST/PATCH 请求,并且只有项目的所有者才能更改/删除它们。

views.py(item_app)

class CreateItemView(APIView):

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

权限.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

身份验证.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)

设置.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 令牌完成的,在登录时我获取访问令牌并将其复制并粘贴到邮递员中的“授权”标题中,当我启用此标题时,仍然出现错误在此处输入图像描述]1

python django authentication django-rest-framework permissions
1个回答
0
投票

在您的 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]

要为 CreateItemView 使用 JWT 认证类,请清除authentication_classes。

并且要应用多个权限类别,需要使用位运算符。

class CreateItemView(APIView):

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

最后,如果您查看您提供的最后一张图片,您传递的值中未指定令牌类型。您的项目使用了 JWT 身份验证,您需要在开头添加 'Bearer' 并提供 access_token。

授权:'承载{access_token}'

© www.soinside.com 2019 - 2024. All rights reserved.