JWT-аутентификация для фреймворка Django rest --> error ={ "detail": "Учетные данные для аутентификации не были предоставлены". }
Я использую JWT для аутентификации и не могу заставить эту ошибку исчезнуть...
HTTP 401 Unauthorized
Allow: GET, OPTIONS
Content-Type: application/json
Vary: Accept
WWW-Authenticate: Bearer realm="api"
{
"detail": "Authentication credentials were not provided."
}
Ниже приведены все мои файлы кода... Я думаю, что ошибка находится в секции simple_jwt в файле настроек, но не могу понять, что именно. Я уже просмотрел несколько ответов на stackoverflow, но ничего не сработало в моем случае.
settings.py
REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES': (
'rest_framework_simplejwt.authentication.JWTAuthentication',
# 'rest_framework.authentication.TokenAuthentication',
),
}
from datetime import timedelta
from django.conf import settings
SIMPLE_JWT = {
'ACCESS_TOKEN_LIFETIME': timedelta(minutes=30),
# 'REFRESH_TOKEN_LIFETIME': timedelta(days=1),
'ROTATE_REFRESH_TOKENS': False,
'BLACKLIST_AFTER_ROTATION': False,
'UPDATE_LAST_LOGIN': False,
'ALGORITHM': 'HS256',
'SIGNING_KEY': settings.SECRET_KEY,
'VERIFYING_KEY': None,
'AUDIENCE': None,
'ISSUER': None,
'JWK_URL': None,
'LEEWAY': 0,
'AUTH_HEADER_TYPES': ('Bearer',),
'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',
'JTI_CLAIM': 'jti',
'SLIDING_TOKEN_REFRESH_EXP_CLAIM': 'refresh_exp',
'SLIDING_TOKEN_LIFETIME': timedelta(minutes=5),
'SLIDING_TOKEN_REFRESH_LIFETIME': timedelta(days=1),
}
serializers.py
from rest_framework import serializers
from django.contrib.auth.models import User
from rest_framework_simplejwt.tokens import RefreshToken, Token
from .models import Book
class UserSerializer(serializers.ModelSerializer):
name = serializers.SerializerMethodField(read_only=True)
_id = serializers.SerializerMethodField(read_only=True)
isAdmin = serializers.SerializerMethodField(read_only=True)
class Meta:
model = User
fields = ['id', '_id', 'email', 'username', 'name', 'isAdmin']
def get__id(self, obj):
return obj.id
def get_isAdmin(self, obj):
return obj.is_staff
def get_name(self, obj):
name = obj.first_name
if name == '':
name = obj.email
return name
class UserSerializerWithToken(UserSerializer):
token = serializers.SerializerMethodField(read_only=True)
class Meta:
model = User
fields = ['id', '_id', 'email', 'username', 'name', 'isAdmin', 'token']
def get_token(self, obj):
token = RefreshToken.for_user(obj)
return str(token.access_token)
class BookSerializer(serializers.ModelSerializer):
class Meta:
model = Book
fields = '__all__'
views.py
from django.db.models.fields import BooleanField
from django.shortcuts import render
from django.contrib.auth.models import User
from django.contrib.auth.hashers import make_password
from rest_framework import status
from rest_framework import serializers
from rest_framework.decorators import api_view, permission_classes
from rest_framework.permissions import IsAuthenticated, IsAdminUser
from rest_framework.response import Response
from BL.models import Book
from BL.books import books
from BL.serializers import BookSerializer
from rest_framework_simplejwt.serializers import TokenObtainPairSerializer
from rest_framework_simplejwt.views import TokenObtainPairView
@api_view(['GET'])
@permission_classes([IsAuthenticated])
def getBooks(request):
books = Book.objects.all()
serializer = BookSerializer(books, many=True)
return Response(serializer.data)
@api_view(['GET'])
def getBook(request, bk):
book = Book.objects.all()
serializer = BookSerializer(book, many=False)
return Response(serializer.data)
urls.py
from django.urls import path
from BL.views import book_views as views
from rest_framework_simplejwt.views import (
TokenObtainPairView,
)
urlpatterns = [
path('', views.getBooks, name="books"),
path('<str:bk>', views.getBook, name="book")
]
Вы все сделали правильно, кроме того, что вам нужно добавить url для входа в urlpatterns, так как вы не позволяете просматривать представление без входа в систему, попробуйте войти в систему, используя api/token url и используя токен доступа, вы сможете войти в систему
urlpatterns = [
path('', views.getBooks, name="books"),
path('<str:bk>', views.getBook, name="book"),
path('api/token/', jwt_views.TokenObtainPairView.as_view(), name='token_obtain_pair'),
path('api/token/refresh/', jwt_views.TokenRefreshView.as_view(), name='token_refresh'),
]