Я действительно застрял.Вот что я пытаюсь сделать.
- СОХРАНИТЬ CSRF Вкл.- пожалуйста, не говорите мне, чтобы отключить его.
- У меня есть приложение API, запущенное Django и Django Rest Framework
- У меня есть приложение внешнего интерфейса, запущенное Vue
- Я установил django-cors-headers для управления CORS
Все отлично работает локально.Как только я перехожу в производство, я получаю ошибки CSRF.Вот как все работает.
Я видел ответы повсюду, в которых говорилось все: от отключения CSRF до разрешения всего для всех вещей.Я хочу сделать это правильно, а не просто отключить все, открыть все и получить дыру в безопасности.
Итак, вот что у меня есть.
Установлено: django-cors-headersdjango-rest-framework drf-nested-маршрутизаторы ... и другие
У меня есть API, работающий на api.websitename.com, а приложение Vue.js работает на websitename.com.
GET запросы работают отлично.Запросы OPTION, похоже, работают.
Любой рискованный запрос не работает.
Для моего CORS у меня установлено 'corsheaders.middleware.CorsMiddleware',
перед моим другим MIDDLEWARE
.
Затем мой CORSнастройки:
CORS_ALLOW_CREDENTIALS = True
CORS_ORIGIN_WHITELIST = (
'*.websitename.com',
)
И мои настройки CSRF:
CSRF_TRUSTED_ORIGINS = [
"api.websitename.com",
]
Независимо от того, как я с ними играю, я получаю ошибку токена CSRF.
Я попытался сделать что-то подобное в моем файле Vue App.vue:
mounted () {
this.getCSRFToken()
},
methods: {
getCSRFToken () {
return axios.get('token/').then(response => {
axios.defaults.headers.common['x-csrftoken'] = Cookies.get('csrftoken')
}).catch(error => {
return Promise.reject(error.response.data)
})
}
}
Идея в том, что я получаю токен CSRF, как только приложение загружается в браузер.Но даже при этом я получаю ошибочные ошибки токена CSRF, когда приложение пытается сделать что-либо, кроме GET или OPTION.
Вот представление, которое возвращает токен, если вас интересует:
class CSRFTokenView(APIView):
permission_classes = (permissions.AllowAny,)
@method_decorator(ensure_csrf_cookie)
def get(self, request):
return HttpResponse()
Я понимаю, что здесь могут быть проблемы с микшированием, но любые предложения, которые могут помочь мне решить эту проблему, приветствуются.