Как исправить "Учетные данные для аутентификации не были предоставлены" при запросе почты Даже на [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
]
Ссылки: