Как решить ошибку "detail": "Учетные данные для аутентификации не были предоставлены." ошибку для APIView Django REST Framework на основе классов?
Я использую Django REST Framework и следую этому руководству для получения всех пользователей при аутентификации пользователя admin.
APIView of Django REST Framework на основе классов
Я использую Postman для тестирования и пытаюсь получить список всех пользователей, зарегистрированных в системе.
Сначала я пытаюсь использовать свой API "User Login with Token" в Postman для создания необходимого токена, как показано ниже:
Я скопировал значение ключа "token" и вставил его в качестве значения ключа "Authorization" в разделе "Headers" API "Get All Users" в Postman, как показано ниже. Это GET-запрос, и я получаю ошибку "detail": "Authentication credentials were not provided."
в качестве ответа.
Необходимые фрагменты кода следующие:
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()),
]
С нетерпением жду вашей поддержки и помощи. Если вам нужна дополнительная информация, я вам ее предоставлю.
Спасибо.
В вашем файле 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",
}
и это сработало для меня, просто чтобы проверить мои конечные точки, я знаю, что это не лучший способ, но он работает, я обновлю свой ответ позже с лучшим подходом.