Django Rest framework не принимает аутентификацию JWT
Я не занимаюсь бэкендом и питоном и пытаюсь реализовать JSON REST-API с помощью django и django restframework. Для аутентификации я хотел бы использовать простой jwt для django.
Я реализовал его с помощью этого руководства по началу работы: https://django-rest-framework-simplejwt.readthedocs.io/en/latest/getting_started.html
Я получаю правильную строку JWT, но если я хочу получить данные с помощью GET запроса и jwt в заголовке Authentication
, я всегда получаю 403 с {message: 'Authentication credentials were not provided'}
.
Мой код выглядит следующим образом:
settings.py
from pathlib import Path
import os
from datetime import timedelta
from rest_framework.permissions import IsAuthenticated, DjangoModelPermissions, AllowAny
...
INSTALLED_APPS = [
'rest_framework_simplejwt',
'rest_framework',
]
...
REST_FRAMEWORK = {
'DEFAULT_PERMISSION_CLASSES': (
'rest_framework.permissions.IsAuthenticated',
),
'DEFAULT_AUTHENTICATION_CLASSES': (
'rest_framework_simplejwt.authentication.JWTAuthentication',
),
}
SIMPLE_JWT = {
'ACCESS_TOKEN_LIFETIME': timedelta(minutes=60),
'REFRESH_TOKEN_LIFETIME': timedelta(days=1),
'AUTH_HEADER_TYPES': ('Bearer',),
}
CORS_ALLOW_ALL_ORIGINS = True
PERMISSION_CLASSES = [IsAuthenticated]
urls.py
from django.contrib import admin
from django.urls import include, path
from rest_framework.schemas import get_schema_view
from rest_framework.documentation import include_docs_urls
from rest_framework_simplejwt.views import (
TokenObtainPairView,
TokenRefreshView,
TokenVerifyView
)
urlpatterns = [
path('api-auth/', include('rest_framework.urls')),
path('api/token/', TokenObtainPairView.as_view(), name='token_obtain_pair'),
path('api/token/refresh/', TokenRefreshView.as_view(), name='token_refresh'),
path('api/token/verify/', TokenVerifyView.as_view(), name='token_verify'),
path('nutzer_api/', include('nutzer.urls')),
path('admin/', admin.site.urls),
path('docs/', include_docs_urls(title="DatenmanagerAPI")),
]
nutzer/settings.py
from django.urls import path
from . import views
urlpatterns = [
path('hello/', views.HelloView.as_view(), name='hello'),
]
nutzer/urls.py
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework.permissions import IsAuthenticated
class HelloView(APIView):
permission_classes = (IsAuthenticated,)
def get(self, request):
content = {'message': 'Hello, World!'}
return Response(content)
curl \
-X POST \
-H "Content-Type: application/json" \
-d '{"username": "admin", "password": "admin"}' \
http://localhost:8001/api/token/
возвращает json с маркером доступа и обновления
curl -X GET -H "Content-Type: application/json" -H "Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ0b2tlbl90eXBlIjoiYWNjZXNzIiwiZXhwIjoxNjY1ODYxMjMzLCJqdGkiOiI3OTExOGUwNWJhMmY0YTBmYTk1ZWUwYmFmMmY0MTY2YyIsInVzZXJfaWQiOjF9.1jVUhBi8fySURPgBpwLcbs8W5anvZzZ9tgduGf-gX8E" http://localhost:8001/nutzer_api/hello
возвращает значение 403. То же самое с postman.
Если я изменю значение permission_classes в nutzer/urls.py
на IsAuthenticatedOrReadOnly
, я получу правильный ответ.
Проект работает в среде docker. Есть ли какая-нибудь очевидная ошибка, которую я допустил?
Огромное спасибо за помощь! Будьте здоровы, Матиас