使用:
- Django 3.x [Django-Filters 2.2.0,graphene-django 2.8.0,graphql-relay 2.0.1]
- Vue 2.x [Vue-Apollo]
我正在使用 Django、GraphQL 和 Vue-Apollo 测试单页 vue 应用程序。
如果我csrf_exempt
在我的视图中使用一切都在前端工作。
urlpatterns = [
<...>
path("graphql", csrf_exempt(GraphQLView.as_view(graphiql=True))),
<...>
现在我想 CSRF 保护我的请求。在了解 CSRF 保护的过程中,我认为 DjangoGraphQLView
需要的只是接收X-Csrftoken
请求标头中的“值”。所以我专注于csrf
以不同的方式发送价值......通过这样的单一视图
path('csrf/', views.csrf),
path("graphql", GraphQLView.as_view(graphiql=True)),
或通过确保 cookie 与ensure_csrf_cookie
然后在我的ApolloClient
我获取这些 Value 并用请求 Header 将他发回。
这是当我从 Django-Vue 页面发送 GraphQL 请求时 Django 打印的内容。
Forbidden (CSRF token missing or incorrect.): /graphql
并行我总是用这些请求进行测试,graphiql IDE
这些请求仍然有效。我也每次打印info.context.headers
我的查询解析器的值。
{'Content-Length': '400', 'Content-Type': 'application/json',
'Host': 'localhost:7000', 'Connection': 'keep-alive',
'Pragma': 'no-cache', 'Cache-Control': 'no-cache',
'Accept': 'application/json', 'Sec-Fetch-Dest': 'empty', 'X-Csrftoken': 'dvMXuYfAXowxRGtwSVYQmpNcpGrLSR7RuUnc4IbIarjljxACtaozy3Jgp3YOkMGz',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.122 Safari/537.36',
'Origin': 'http://localhost:7000',
'Sec-Fetch-Site': 'same-origin', 'Sec-Fetch-Mode': 'cors',
'Referer': 'http://localhost:7000/graphql', 'Accept-Encoding': 'gzip, deflate, br', 'Accept-Language': 'en-US,en;q=0.9,de;q=0.8',
'Cookie': 'sessionid=jqjvjfvg4sjmp7nkeunebqos8c7onhiz; csrftoken=dvMXuYfAXowxRGtwSVYQmpNcpGrLSR7RuUnc4IbIarjljxACtaozy3Jgp3YOkMGz'}
我认识到GraphQLView IDE
总是将 the X-Csrftoken
和 theCookie:..csrftoken.
放在请求中。如果在发送请求之前删除 a 的 csrftoken-cookie GraphQLView IDE
,我会得到这个
Forbidden (CSRF cookie not set.): /graphql
IDE 显示一个长长的红色报告
.... CSRF verification failed. Request aborted.</p>\n\n\n
<p>You are seeing this message because this site requires a CSRF cookie when submitting forms.
This cookie is required for security reasons, to ensure that your browser is not being hijacked by third parties.</p>\n
IDE 的信息说请求需要一个 CSRF cookie。但是到目前为止,在 Doc 的论坛中阅读的所有内容都与价值本身有关。这意味着您所需要的只是在 Header 中发送 csrf 值,X-Csrftoken
然后 View 就会发挥作用。
问题
因此我的问题是:
我是否必须同时在我的 django 上设置X-Csrftoken
和Cookie:..csrftoken
ApolloClient
GraphQLView
或者是否也可以只发送X-Csrftoken
不带 a 的csrf-cookie
,反之亦然?