#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
})