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 и получил ту же проблему...
- Вы установили свои
authentication_classes=[], так что DRF не выполняет никаких действий.
- Затем вы требуете, чтобы они вошли в систему с помощью вашего
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}.
Если это не та документация или пакет, пожалуйста, пришлите ссылку на правильную документацию или пакет, а также место, где говорится об использовании Token (на самом деле это то, как работает simple_jwt, а не этот пакет).
В вашем файле настроек вы фактически переопределяете все настройки по умолчанию, когда вам нужны только те, которые вы хотите изменить. В этом списке, в самом низу, я вижу следующее:
'JWT_AUTH_HEADER_PREFIX': 'JWT',
