Как решить ошибку "detail": "Учетные данные для аутентификации не были предоставлены." ошибку для APIView Django REST Framework на основе классов?

Я использую Django REST Framework и следую этому руководству для получения всех пользователей при аутентификации пользователя admin.

APIView of Django REST Framework на основе классов

Я использую Postman для тестирования и пытаюсь получить список всех пользователей, зарегистрированных в системе.

Сначала я пытаюсь использовать свой API "User Login with Token" в Postman для создания необходимого токена, как показано ниже:

User Login with Token

Я скопировал значение ключа "token" и вставил его в качестве значения ключа "Authorization" в разделе "Headers" API "Get All Users" в Postman, как показано ниже. Это GET-запрос, и я получаю ошибку "detail": "Authentication credentials were not provided." в качестве ответа.

Get All Users

Необходимые фрагменты кода следующие:

views.py

class UserAccountListView(APIView):
"""
    List of All Users in the System / Application
    * Requires Token Authentication.
    * Only Admin Users are able to access this view.
"""
authentication_classes = (TokenAuthentication, )
permission_classes = (IsAdminUser, )

def get(self, request, format=None):
    """
        Returns a List of All Users
    """
    full_names = [user.full_name for user in UsersAccount.objects.all()]
    return Response(full_names)

settings.py

REST_FRAMEWORK = {
    # Use Django's standard `django.contrib.auth` permissions,
    # or allow read-only access for unauthenticated users.
    'DEFAULT_PERMISSION_CLASSES': [
        'rest_framework.permissions.IsAuthenticated',
        'rest_framework.permissions.IsAdminUser',
    ],
    'DEFAULT_AUTHENTICATION_CLASSES': [
        'rest_framework_simplejwt.authentication.JWTAuthentication',
        'rest_framework.authentication.TokenAuthentication',
    ],

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": True,

    "ALGORITHM": "HS256",
    "SIGNING_KEY": SECRET_KEY,
    "VERIFYING_KEY": None,
    "AUDIENCE": None,
    "ISSUER": None,

    "AUTH_HEADER_TYPES": ("Bearer", ),
    "AUTH_HEADER_NAME": "HTTP_AUTHORIZATION",
    "USER_ID_FIELD": "id",
    "USER_ID_CLAIM": "user_id",

    "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),
}

urls.py

urlpatterns = [
    path('', UsersAccountAPIOverview.as_view()),
    path("all", UserAccountListView.as_view()),
    path("register", UsersAccountRegistrationView.as_view()),
    path("token", UserAccountTokenObtainPairView.as_view()),
    path("token/refresh", TokenRefreshView.as_view()),
    path("token/verify", TokenVerifyView.as_view()),
]

С нетерпением жду вашей поддержки и помощи. Если вам нужна дополнительная информация, я вам ее предоставлю.

Спасибо.

Вы должны добавить Bearer в postman :

"Authorization" : "Bearer [token]"

postamn token

В вашем файле views.py удалите строку:

authentication_classes = (TokenAuthentication, )

Это происходит потому, что в вашем файле settings.py первая строка:

'DEFAULT_AUTHENTICATION_CLASSES': [
    'rest_framework_simplejwt.authentication.JWTAuthentication',
    ...
],

указание JWTAuthentication, а не TokenAuthentication

Я использую cookiecuter + django, и это потрясающе, а также пинок под зад. jaja, но поскольку мне было интересно продолжать свой проект, я просто закомментировал эти строки в base.py (в вашем случае это было бы в settings.py)

REST_FRAMEWORK = {
"DEFAULT_AUTHENTICATION_CLASSES": (
    # "rest_framework.authentication.SessionAuthentication",
    # "rest_framework.authentication.TokenAuthentication",
),
# "DEFAULT_PERMISSION_CLASSES": ("rest_framework.permissions.IsAuthenticated",),
"DEFAULT_SCHEMA_CLASS": "drf_spectacular.openapi.AutoSchema",
}

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

Вернуться на верх