Файл cookie CSRF не установлен [Django / AngularJS]

#angularjs #django #csrf #django-rest-framework-jwt

#angularjs #django #csrf #django-rest-framework-jwt

Вопрос:

Прежде всего, это не дублирующий вопрос. Я перепробовал все связанные сообщения в stackoverflow, но не смог найти решение.

У меня есть приложение Django для серверной части и приложение AngularJS для интерфейса. Я использую djangorestframework-jwt для аутентификации по API. У меня есть конечная точка API, которая не требует никакой аутентификации, и я получаю CSRF Failed: CSRF cookie not set ошибку в браузере только для этой конечной точки.

В моих настройках django у меня есть:

ALLOWED_HOSTS = ['*']

и он не включает никаких CSRF_COOKIE_SECURE , CSRF_COOKIE_HTTPONLY или SESSION_COOKIE_SECURE настроек.

djangorestframework-jwt Настройки являются:

 JWT_AUTH = {
    'JWT_SECRET_KEY': SECRET_KEY,
    'JWT_ALGORITHM': 'HS256',
    'JWT_VERIFY': True,
    'JWT_VERIFY_EXPIRATION': True,
    'JWT_EXPIRATION_DELTA': datetime.timedelta(seconds=3000),
    'JWT_ALLOW_REFRESH': True,
    'JWT_REFRESH_EXPIRATION_DELTA': datetime.timedelta(days=1),
    'JWT_AUTH_COOKIE': 'refresh-token'
}
  

Я заметил, что в файлах cookie браузера, если есть какой-либо refresh-token ключ, конечная точка работает просто отлично. Проблема возникает, когда этот ключ отсутствует в файлах cookie браузера. Я установил 'JWT_AUTH_COOKIE': None или удалил следующие строки:

 'JWT_ALLOW_REFRESH': True,
'JWT_REFRESH_EXPIRATION_DELTA': datetime.timedelta(days=1),
'JWT_AUTH_COOKIE': 'refresh-token'
  

из JWT_AUTH настроек, но безуспешно.

Я также пробовал @csrf_excempt для этой конечной точки, но это тоже не сработало.

Интересно, что когда я отправляю запрос от postman, это работает.

Вот запрос, который я отправляю из интерфейса:

 $http({
    url: url,
    method: "PUT",
    headers: {
        'Content-Type': 'application/json'
    },
    data: data
})
  

Я хотел бы знать, почему я получаю сообщение об ошибке, когда refresh_token ключ отсутствует в файлах cookie браузера, и как решить эту проблему.

Комментарии:

1. какую ошибку вы получаете? и какие-либо исключения?

2. Я получаю CSRF Failed: CSRF cookie not set. в браузере.

3. Я только что пробовал, но это тоже не работает.

4. вы удалили промежуточное программное обеспечение csrf, но все равно написано, что CSRF не удался?

5. Да, я закомментировал эту строку и перезапустил сервер. Затем я отправил запрос из интерфейса после обновления страницы.

Ответ №1:

Я решил свою проблему, добавив 'X-CSRFToken': $cookies.get("csrftoken") в заголовок Http-запроса, поэтому запрос теперь выглядит следующим образом:

 $http({
    url: url,
    method: "PUT",
    headers: {
        'Content-Type': 'application/json',
        'X-CSRFToken': $cookies.get("csrftoken")
    },
    data: data
})