Аутентификация JWT не работает в фреймворке django rest
У меня есть следующий проект urls.py:
urlpatterns = [
path('admin/', admin.site.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("cadence/", include("cadence.urls")),
]
файл settings.py:
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'cadence',
'rest_framework_simplejwt',
'rest_framework'
]
REST_FRAMEWORK = {
'DEFAULT_PERMISSION_CLASSES': (
'rest_framework.permissions.IsAuthenticated',
),
'DEFAULT_AUTHENTICATION_CLASSES': (
'rest_framework_simplejwt.authentication.JWTAuthentication',
)
}
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
SIMPLE_JWT = {
'AUTH_HEADER_TYPES': ('JWT',),
"ACCESS_TOKEN_LIFETIME": timedelta(days=30),
"REFRESH_TOKEN_LIFETIME": timedelta(days=2),
}
app urls.py:
urlpatterns = [
path('', PlaylistViews.as_view()),
path('api/playlist/get_all_playlists/', PlaylistViews.get_all_playlists, name='get_all_playlists'),
]
PlaylistModel.py:
class Playlist(models.Model):
name = models.CharField(max_length=255)
class Meta:
db_table = 'playlists'
PlaylistViews.py:
class PlaylistViews(APIView):
authentication_classes = [JWTAuthentication]
permission_classes = [IsAuthenticated]
def get(self, request):
content = {'message': 'Hello, World!'}
return Response(content)
def post(self, request):
try:
serializer = PlaylistSerializer(data=request.data)
if serializer.is_valid():
serializer.save()
return Response({'message': 'Playlist added successfully.', 'data': serializer.data}, status=status.HTTP_201_CREATED)
return Response({'message': 'Failed to add playlist.', 'errors': serializer.errors}, status=status.HTTP_400_BAD_REQUEST)
except Exception as error:
return Response({'error': str(error)}, status=status.HTTP_500_INTERNAL_SERVER_ERROR)
@api_view(['GET'])
def get_all_playlists(request):
try:
playlists = Playlist.objects.all()
serializer = PlaylistSerializer(playlists, many=True)
return Response(serializer.data)
except Exception as error:
return Response({'error': str(error)}, status=status.HTTP_500_INTERNAL_SERVER_ERROR)
Когда я вызываю следующий api: http://localhost:8000/api/token/
, я получаю токен, а когда я использую его в любом другом вызове api, я получаю следующую ошибку: "Учетные данные для аутентификации не были предоставлены.".
Однако я отправляю токен в авторизации как токен на предъявителя в postman.
Попробуйте использовать следующие JWT
настройки авторизации
# JWT Settings
SIMPLE_JWT = {
'ACCESS_TOKEN_LIFETIME': timedelta(minutes=20),
'REFRESH_TOKEN_LIFETIME': timedelta(days=1),
'AUTH_HEADER_TYPES': ('Bearer',), # < --- Need to change
'AUTH_HEADER_NAME': 'HTTP_AUTHORIZATION',
'USER_ID_FIELD': 'id',
'USER_ID_CLAIM': 'user_id',
'USER_AUTHENTICATION_RULE': 'rest_framework_simplejwt.authentication.default_user_authentication_rule',
'AUTH_TOKEN_CLASSES': ('rest_framework_simplejwt.tokens.AccessToken',),
'TOKEN_TYPE_CLAIM': 'token_type',
'TOKEN_USER_CLASS': 'rest_framework_simplejwt.models.TokenUser',
'JTI_CLAIM': 'jti',
}