Django rest framework jwt {"detail": "У вас нет разрешения на выполнение этого действия."}

Я пытаюсь сделать запрос, используя django-rest-framework и django-rest-framework-jwt но ответ, который я получаю detail": "You do not have permission to perform this action."

views.py

class Test(generics.RetrieveAPIView):
    permission_classes = [IsAuthenticated]
    authentication_classes = []
    queryset = User.objects.all()
    def get(self, request):
        return response.Response({"test": "Test "}, status=status.HTTP_200_OK)

urls.py

from rest_framework_jwt.views import obtain_jwt_token, refresh_jwt_token
from .views import Test
urlpatterns = [
    path('', Test.as_view(), name='test'),
    path('token/', obtain_jwt_token, name='token_obtain_pair'),
    path('token/refresh/', refresh_jwt_token, name='token_refresh'),
]

settings.py

REST_FRAMEWORK = {
    'DEFAULT_PERMISSION_CLASSES': (
        'rest_framework.permissions.IsAuthenticated',
    ),
    'DEFAULT_AUTHENTICATION_CLASSES': (
        'rest_framework_jwt.authentication.JSONWebTokenAuthentication',
        'rest_framework.authentication.SessionAuthentication',
        'rest_framework.authentication.BasicAuthentication',
    ),
}
JWT_AUTH = {
    'JWT_ENCODE_HANDLER':
    'rest_framework_jwt.utils.jwt_encode_handler',
    'JWT_DECODE_HANDLER':
    'rest_framework_jwt.utils.jwt_decode_handler',
    'JWT_PAYLOAD_HANDLER':
    'rest_framework_jwt.utils.jwt_payload_handler',
    'JWT_PAYLOAD_GET_USER_ID_HANDLER':
    'rest_framework_jwt.utils.jwt_get_user_id_from_payload_handler',
    'JWT_RESPONSE_PAYLOAD_HANDLER':
    'rest_framework_jwt.utils.jwt_response_payload_handler',
    'JWT_SECRET_KEY': SECRET_KEY,
    'JWT_GET_USER_SECRET_KEY': None,
    'JWT_PUBLIC_KEY': None,
    'JWT_PRIVATE_KEY': None,
    'JWT_ALGORITHM': 'HS256',
    'JWT_VERIFY': True,
    'JWT_VERIFY_EXPIRATION': True,
    'JWT_LEEWAY': 0,
    'JWT_EXPIRATION_DELTA': timedelta(days=5),
    'JWT_AUDIENCE': None,
    'JWT_ISSUER': None,
    'JWT_ALLOW_REFRESH': True,
    'JWT_REFRESH_EXPIRATION_DELTA': timedelta(days=7),
    'JWT_AUTH_HEADER_PREFIX': 'JWT',
    'JWT_AUTH_COOKIE': None,
}

и просьба, с которой я обратился: >curl -X GET http://127.0.0.1:8000/users/ -H 'Authorization: Token eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VyX2lkIjoxMCwidXNlcm5hbWUiOiJoYXNhbm1iaWxhbDE5OThAZ21haWwuY29tIiwiZXhwIjoxNjUxNTkxMDYxLCJlbWFpbCI6Imhhc2FubWJpbGFsMTk5OEBnbWFpbC5jb20iLCJvcmlnX2lhdCI6MTY1MTE1OTA2MX0.bvmtH6mnItBjwKkvaNU5eMXlEyk2ZAytMWzhEE_Ibhs'

Примечание: Я использовал django-rest-framework-simplejwt и получил ту же проблему...

  1. Вы установили свои authentication_classes=[], так что DRF
  2. не выполняет никаких действий.
  3. Затем вы требуете, чтобы они вошли в систему с помощью вашего permissions_classes

На данный момент просто удалите authentication_classes = [] из представления. Ваши разрешения по умолчанию также требуют аутентификации, поэтому эту строку также можно удалить.

Основываясь на вашем использовании здесь, вы, вероятно, должны использовать APIView, а не дженерики. Если вы планируете использовать возможности дженериков (и правильно строить маршруты вручную), то продолжайте в том же духе.

class Test(APIView):
    # use default permission_classes in REST_FRAMEWORK
    # use default authentication_classes in REST_FRAMEWORK

    def get(self, request):
        return Response({"data": "Test"})

Чтобы ответить на ваш новый вопрос, и после обращения к документации для пакета rest_framework_jwt, вам нужно отправить токен как Authorization: JWT {token}.

enter image description here

Если это не та документация или пакет, пожалуйста, пришлите ссылку на правильную документацию или пакет, а также место, где говорится об использовании Token (на самом деле это то, как работает simple_jwt, а не этот пакет).

В вашем файле настроек вы фактически переопределяете все настройки по умолчанию, когда вам нужны только те, которые вы хотите изменить. В этом списке, в самом низу, я вижу следующее:

    'JWT_AUTH_HEADER_PREFIX': 'JWT',
Вернуться на верх