Django Rest Framework,CSRF和Vue.js

Dav*_*win 8 django django-rest-framework vue.js

我正在尝试使用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'
    )
}
Run Code Online (Sandbox Code Playgroud)

这是我的Vue.js配置:

var csrftoken = Cookies.get('csrftoken');
Vue.http.headers.common['HTTP_X_CSRFTOKEN'] = csrftoken;
Run Code Online (Sandbox Code Playgroud)

这是发送的标题的相关部分:

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/
Run Code Online (Sandbox Code Playgroud)

如您所见,Cookie.csrf和HTTP_X_CSRFTOKEN标头匹配

我真的很难过.有什么建议?

Dam*_*nic 9

所以我发布这个作为回答问题的答案.

问题是因为根据请求发送了错误的CSRF标头名称.根据文件:

与request.META中的其他HTTP头一样,从服务器接收的头名称通过将所有字符转换为大写,用下划线替换任何连字符,并在名称中添加"HTTP_"前缀来规范化.例如,如果您的客户端发送'X-XSRF-TOKEN'标头,则该设置应为'HTTP_X_XSRF_TOKEN'.

另外我在这里留下我的问题的参考,它积累了几个可能导致CSRF Failed: CSRF token missing or incorrect.Django错误的问题.

  • 对于在堆栈中使用 NGINX 的任何人:如果您保留默认设置,NGINX 将不会传递您的标头。您可以通过使用连字符而不是下划线发送标头并省略 HTTP_ 部分来避免这种情况。然后 Django 会将其恢复为正确的格式。下面的代码应该适用于标准 Django 设置 `var csrftoken = Cookies.get('csrftoken'); Vue.http.headers.common['X-CSRFTOKEN'] = csrftoken;` (2认同)