【发布时间】:2019-07-17 02:19:42
【问题描述】:
我真的被困住了。这就是我想要做的。
- 保持 CSRF 开启。 - 请不要告诉我关掉它。
- 我有一个由 Django 和 Django Rest Framework 运行的 API 应用程序
- 我有一个由 Vue 运行的前端应用程序
- 我已经安装了 django-cors-headers 来管理 CORS
在本地一切都很好。一旦我将它投入生产,我就开始收到 CSRF 错误。一切都是这样运作的。
我已经看到所有的答案都说了从关闭 CSRF 到允许所有事情的一切。我想正确地做到这一点,而不仅仅是关闭一切并打开一切并最终导致安全漏洞。
所以,这就是我所拥有的。
已安装: django-cors-headers django-rest-framework drf-嵌套路由器 ...和其他人
我的 api 在 api.websitename.com 上运行,而 Vue.js 应用在 websitename.com 上运行。
GET 请求效果很好。 OPTION 请求似乎有效。
任何有风险的请求都不起作用。
对于我的 CORS,我在其他 MIDDLEWARE 之前安装了 'corsheaders.middleware.CorsMiddleware',。
那么我的 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)
})
}
}
我的想法是,只要 APP 在浏览器中加载,我就会得到一个 CSRF 令牌。但即便如此,当应用尝试执行除 GET 或 OPTION 之外的任何操作时,我仍会收到失败的 CSRF 令牌错误。
这是返回令牌的视图,以防你的古玩:
class CSRFTokenView(APIView):
permission_classes = (permissions.AllowAny,)
@method_decorator(ensure_csrf_cookie)
def get(self, request):
return HttpResponse()
我知道我可能会在这里混合问题,但欢迎任何可以帮助我解决此问题的建议。
【问题讨论】:
标签: django vue.js django-rest-framework django-csrf django-cors-headers