【发布时间】:2016-06-23 05:08:53
【问题描述】:
我正在尝试使用 Vue.js 对我使用 Django Rest Framework 创建的 REST Api 执行一些 POST 方法。问题是,我在发帖时收到CSRF Failed: CSRF token missing or incorrect. 错误。但我可以看到 csrf cookie,它正在被添加到标题中。
这是我的设置:
REST_FRAMEWORK = {
'DEFAULT_PERMISSION_CLASSES': (
'rest_framework.permissions.IsAuthenticated',
'rest_framework.permissions.DjangoModelPermissions'
),
'DEFAULT_AUTHENTICATION_CLASSES': (
'rest_framework.authentication.SessionAuthentication',
'rest_framework.authentication.BasicAuthentication'
)
}
这是我的 Vue.js 配置:
var csrftoken = Cookies.get('csrftoken');
Vue.http.headers.common['HTTP_X_CSRFTOKEN'] = csrftoken;
这是发送的标头的相关部分:
Cookie:djdt=hide; tabstyle=raw-tab; sessionid=1gl533mrneudxw3l9l2vg0ja1yowwmeo; csrftoken=dN85bhztB1oVRov87BsUrWTM29Ff9sjn
Host:127.0.0.1:8000
HTTP_X_CSRFTOKEN:dN85bhztB1oVRov87BsUrWTM29Ff9sjn
Origin:http://127.0.0.1:8000
Referer:http://127.0.0.1:8000/agencies/6/add-profiles/
如您所见,Cookie.csrf 和 HTTP_X_CSRFTOKEN 标头匹配
我真的很难过。有什么建议吗?
【问题讨论】:
-
您使用什么
CSRF_HEADER_NAME设置?我知道HTTP_X_CSRFTOKEN在发送时应该是X-CSRFTOKEN,因为 django 通常会在其内部对其进行格式化:docs.djangoproject.com/en/1.9/ref/settings/#csrf-header-name -
您的应用是否在同一个域中?还是你在使用 CORS?
-
Yerko Palma 是对的,这也可能是同源请求策略或
CSRF_COOKIE_HTTPONLY设置的问题。 -
小子二进制,你是对的。这是“X-CSRFTOKEN”的名字
-
作为一个相关问题,是否需要 vue-resources 库才能使用以下代码行设置标题:
Vue.http.headers.common['X-CSRFTOKEN']?
标签: django django-rest-framework vue.js