CSRF Failed: токен CSRF отсутствует.
Это происходит при попытке получить токен аутентификации с использованием встроенной конечной точки api-token-auth/ Django REST Framework.
Контекст
- Я отправляю запрос POST от Postman (используя raw и application/json для тела).
- Защита CSRF мешает, поскольку Postman, как внешний клиент, не обрабатывает файлы cookie сеанса или токены CSRF.
- Я попытался исправить это, явно применив декоратор @csrf_exempt к представлению в моем urls.py, но ошибка осталась.
Вот соответствующие фрагменты из настроек моего проекта:
1. settings.py (промежуточное ПО и аутентификация DRF)
Мое промежуточное ПО включает защиту от CSRF, и у меня включена SessionAuthentication, что, по-видимому, и вызывает конфликт.
Код: Выделить всё
MIDDLEWARE = [
"django.middleware.security.SecurityMiddleware",
"django.contrib.sessions.middleware.SessionMiddleware",
"django.middleware.common.CommonMiddleware",
"django.middleware.csrf.CsrfViewMiddleware",
"django.contrib.auth.middleware.AuthenticationMiddleware",
"django.contrib.messages.middleware.MessageMiddleware",
"django.middleware.clickjacking.XFrameOptionsMiddleware",
]
REST_FRAMEWORK = {
'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination',
'PAGE_SIZE': 10,
'DEFAULT_AUTHENTICATION_CLASSES': (
'rest_framework.authentication.TokenAuthentication',
'rest_framework.authentication.SessionAuthentication',
),
'DEFAULT_PERMISSION_CLASSES': (
'rest_framework.permissions.IsAuthenticated',
),
}
Вот как я сейчас пытаюсь исключить представление. Я импортировал csrf_exempt из django.views.decorators.csrf.
Код: Выделить всё
from django.contrib import admin
from django.urls import path,include
from rest_framework.authtoken import views
from django.views.decorators.csrf import csrf_exempt
from api import views as api_views
urlpatterns = [
path("home/",include("expenses.urls")),
path("admin/", admin.site.urls),
path("api/",include("api.urls")),
path('api-auth/', include('rest_framework.urls')),
path('api-token-auth/', csrf_exempt(views.obtain_auth_token)),
]
Изображение запроса, который завершается ошибкой
Вопрос
Почему декоратор csrf_exempt игнорируется представлением get_auth_token (который представляет собой представление на основе функций в реализации DRF), хотя я его обертываю urls.py?
Каков надежный и надежный способ отключить защиту CSRF только для конечной точки api-token-auth/, когда в settings.py включена SessionAuthentication?
Примечание. Мне нужно сохранить SessionAuthentication для просматриваемого файла. API.
Подробнее здесь: https://stackoverflow.com/questions/798 ... th-after-a
Мобильная версия