Как исправить "Учетные данные для аутентификации не были предоставлены" при запросе почты Даже на [AllowAny]

У меня есть простая функция на основе @api_view(['POST']) с @permission_classes([AllowAny]). А в DRF настройки в settings.py следующие:

REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': [
        'rest_framework_simplejwt.authentication.JWTAuthentication',
    ],
    'DEFAULT_SCHEMA_CLASS': 'rest_framework.schemas.coreapi.AutoSchema',
}

Теперь в Документации говорится

Класс разрешения AllowAny разрешает неограниченный доступ, независимо от того, был ли запрос аутентифицирован или неаутентифицирован.

Но я получаю следующий ответ на запрос почты:

{
    "detail": "Authentication credentials were not provided."
}

Может ли кто-нибудь описать, в чем может быть проблема? Нужно ли мне изменить DEFAULT_AUTHENTICATION_CLASSES в настройках или что-то еще, так как я не хочу разрешать запрос на этом @api_view.

Согласно this, позиция декоратора неверна. Первый выполняемый декоратор должен быть сверху. Измените декоратор на нижний следующим образом:

@api_view(['POST'])
@permission_classes([AllowAny])
def reset_password_request(email):
    try:
    #...

Ознакомьтесь с официальной документацией для справки.

Давайте разберемся с этим шаг за шагом: Добавьте DEFAULT_PERMISSION_CLASSES следующим образом (для устранения неполадок):

REST_FRAMEWORK = {
    'DEFAULT_PERMISSION_CLASSES': (
        'rest_framework.permissions.IsAuthenticated',
     )
    'DEFAULT_AUTHENTICATION_CLASSES': [
        'rest_framework_simplejwt.authentication.JWTAuthentication',
    ],
    'DEFAULT_SCHEMA_CLASS': 'rest_framework.schemas.coreapi.AutoSchema',
}

** РЕДАКТИРОВАНИЕ 1 **

Попробуйте добавить rest_framework.authentication.SessionAuthentication следующим образом:

REST_FRAMEWORK = {
    'DEFAULT_PERMISSION_CLASSES': (
        'rest_framework.permissions.IsAuthenticated',
     )
    'DEFAULT_AUTHENTICATION_CLASSES': [
        'rest_framework_simplejwt.authentication.JWTAuthentication',
        'rest_framework.authentication.SessionAuthentication'
    ],
    'DEFAULT_SCHEMA_CLASS': 'rest_framework.schemas.coreapi.AutoSchema',
}

** РЕДАКТИРОВАНИЕ 2 **

Теперь, когда у вас есть 403, измените значение по умолчанию на rest_framework.permissions.AllowAny, как показано ниже. Если это работает, удалите DEFAULT_PERMISSION_CLASSES и используйте декораторы вместо этого.

REST_FRAMEWORK = {
    'DEFAULT_PERMISSION_CLASSES': (
        'rest_framework.permissions.AllowAny',
     )
    'DEFAULT_AUTHENTICATION_CLASSES': [
        'rest_framework_simplejwt.authentication.JWTAuthentication',
        'rest_framework.authentication.SessionAuthentication'
    ],
    'DEFAULT_SCHEMA_CLASS': 'rest_framework.schemas.coreapi.AutoSchema',
}

Если DEFAULT_PERMISSION_CLASSES не указано, по умолчанию разрешается неограниченный доступ.

Проблема в ваших шаблонах URL, где password_reset_request удовлетворяет <str:pk>, а вместо него вызывается getUserById с @permission_classes([...]).

Либо используйте конвертер путей uuid:

urlpatterns = [
    # path('user/<str:pk>/', views.getUserById, name='user'),  # Change this
    path('user/<uuid:pk>/', views.getUserById, name='user'),   # to this
    path('user/password_reset_request/',
         views.resetPasswordRequest, name='password_reset_request'),
]

Или изменить порядок, чтобы соответствовать password_reset_request сначала:

urlpatterns = [
    # path('user/<str:pk>/', views.getUserById, name='user'),  # Move this
    path('user/password_reset_request/',
         views.resetPasswordRequest, name='password_reset_request'),
    path('user/<str:pk>/', views.getUserById, name='user'),    # to here
]

Ссылки:

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