Столкнулся с такой ситуацией:
- Опубликовал Ember фронтэнд на Django бакэнде. GET запросы проходят, а вот при POST запросе вылетает ошибка:
POST http://localhost:8000/api/tasks/ 403 (Forbidden)
Error: Adapter operation failed
Смотрю в отладчике хрома network responce:
{"detail":"CSRF Failed: CSRF token missing or incorrect."}
Ничего не понимаю. При разработке Ember фронтэнда POST запросы с localhost:4200 на localhost:8000 пролетают без проблем, а тут при POST запросе с localhost:8000 на localhost:8000 вылетает ошибка связанная с CSRF. Смотрю в Django debug, сравниваю POST запросы с localhost:4200 и localhost:8000 - в обоих случаях передается в request header - authorization - access_token, а вот втором случае дополнительно в request попадают Cookie и Session data. Ну и что с того, что дополнительная информация падает? Смотрю настройки settings.py бакэнда для REST_FRAMEWORK - DEFAULT_AUTHENTICATION_CLASSES прописано:
REST_FRAMEWORK = {
...
'DEFAULT_AUTHENTICATION_CLASSES': (
'rest_framework.authentication.SessionAuthentication',
'rest_framework_jwt.authentication.JSONWebTokenAuthentication',
),
}
и тут до меня доходит, что при POST запросах с localhost:4200 на localhost:8000 используется только 'rest_framework_jwt.authentication.JSONWebTokenAuthentication' , а при POST запросах с localhost:8000 на localhost:8000 сначала попадая на 'rest_framework.authentication.SessionAuthentication' проходит сразу аутентификация, потому что имеются session data, и до аутентификации JSONWebTokenAuthentication дело не доходит. Поэтому я взял и поменял порядок аутентификации - поставил сначала JSONWebTokenAuthentication, а потом SessionAuthentication:
REST_FRAMEWORK = {
...
'DEFAULT_AUTHENTICATION_CLASSES': (
'rest_framework_jwt.authentication.JSONWebTokenAuthentication',
'rest_framework.authentication.SessionAuthentication',
),
}
Теперь все POST запросы проходят! Это тот случай, когда порядок имеет значание!
- Опубликовал Ember фронтэнд на Django бакэнде. GET запросы проходят, а вот при POST запросе вылетает ошибка:
POST http://localhost:8000/api/tasks/ 403 (Forbidden)
Error: Adapter operation failed
Смотрю в отладчике хрома network responce:
{"detail":"CSRF Failed: CSRF token missing or incorrect."}
Ничего не понимаю. При разработке Ember фронтэнда POST запросы с localhost:4200 на localhost:8000 пролетают без проблем, а тут при POST запросе с localhost:8000 на localhost:8000 вылетает ошибка связанная с CSRF. Смотрю в Django debug, сравниваю POST запросы с localhost:4200 и localhost:8000 - в обоих случаях передается в request header - authorization - access_token, а вот втором случае дополнительно в request попадают Cookie и Session data. Ну и что с того, что дополнительная информация падает? Смотрю настройки settings.py бакэнда для REST_FRAMEWORK - DEFAULT_AUTHENTICATION_CLASSES прописано:
REST_FRAMEWORK = {
...
'DEFAULT_AUTHENTICATION_CLASSES': (
'rest_framework.authentication.SessionAuthentication',
'rest_framework_jwt.authentication.JSONWebTokenAuthentication',
),
}
и тут до меня доходит, что при POST запросах с localhost:4200 на localhost:8000 используется только 'rest_framework_jwt.authentication.JSONWebTokenAuthentication' , а при POST запросах с localhost:8000 на localhost:8000 сначала попадая на 'rest_framework.authentication.SessionAuthentication' проходит сразу аутентификация, потому что имеются session data, и до аутентификации JSONWebTokenAuthentication дело не доходит. Поэтому я взял и поменял порядок аутентификации - поставил сначала JSONWebTokenAuthentication, а потом SessionAuthentication:
REST_FRAMEWORK = {
...
'DEFAULT_AUTHENTICATION_CLASSES': (
'rest_framework_jwt.authentication.JSONWebTokenAuthentication',
'rest_framework.authentication.SessionAuthentication',
),
}
Теперь все POST запросы проходят! Это тот случай, когда порядок имеет значание!
Комментариев нет:
Отправить комментарий