Django (DRF) & React - запрещено (файл cookie CSRF не установлен) - PullRequest
0 голосов
/ 23 января 2019

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

У меня есть React-интерфейс, где я использую axios для отправки запросов на бэкэнд. Пример
const request = await axios.post('${BASE_URL}/logout/')

Большинство конечных точек Django Rest Framework создаются с помощью ViewSets. Тем не менее, у меня есть несколько, которые являются собственными и в основном сделаны для аутентификации.

path('createaccount/', views.create_account),
path('me/', views.current_user),
path('logout/', views.logout),
path('login/', views.login),
path('resetpassword', views.reset_password),

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

В некоторых ответах говорится, что мне нужно получить токен CSRF от Django, который хранится в cookie-файлах, и мне нужно передать это в заголовке каждого запроса. В некоторых ответах говорится, что все, что мне нужно сделать, это настроить axios, например

axios.defaults.xsrfHeaderName = "X-CSRFTOKEN";
axios.defaults.xsrfCookieName = "XCSRF-TOKEN";

И это будет "просто работать". Я попытался настроить CSRF_COOKIE_NAME для различных значений, чтобы это тоже заработало.

В некоторых ответах даже сказано сохранить @csrf_exempt, но это звучит как очень, очень плохая идея.

Мне действительно нужно генерировать / получать файл cookie CSRF? Я включаю это с каждым запросом? Или это просто конфигурация axios?

1 Ответ

0 голосов
/ 23 января 2019

Однажды у меня возникла эта проблема, я использовал токен аутентификации.Вот как я это решил.Но не уверен, что это лучшая идея.Я использовал только csrf_exempt для этого представления, а все остальные представления являются наборами.

@csrf_exempt
def get_current_user(request, *args, **kwargs):
    if request.method == 'GET':
        user = request.user
        serializer = UserDataSerializer(user)
        return JsonResponse(serializer.data, safe=False)

Мое промежуточное ПО в settings.py

MIDDLEWARE = [
   'django.middleware.security.SecurityMiddleware',
   'django.contrib.sessions.middleware.SessionMiddleware',
   'corsheaders.middleware.CorsMiddleware',
   # 'django.contrib.auth.middleware.SessionAuthenticationMiddleware',
   'django.middleware.common.CommonMiddleware',
   'django.middleware.csrf.CsrfViewMiddleware',
   'django.contrib.auth.middleware.AuthenticationMiddleware',
   'django.middleware.locale.LocaleMiddleware',
   'oauth2_provider.middleware.OAuth2TokenMiddleware',
   'django.contrib.messages.middleware.MessageMiddleware',
   'django.middleware.clickjacking.XFrameOptionsMiddleware',
   'auditlog.middleware.AuditlogMiddleware',
]
...