我用graphene-django。创建应用程序时,GraphiQL在登录和其他功能方面工作得很好。但是当我使用Insomnia时,我会得到一个403 Forbidden错误。
我试过:
csrf_exempt;它工作得很好,但我当然不会使用它。django-cors-headers;它使而不是工作得很好。如何解决这个403错误?
发布于 2020-03-24 23:59:07
我不推荐@yestema的第二种方法来解决你面临的问题。
避免使用GET方法查询GraphQL端点
如果一个人想要实现这个解决方案,并且也在为mutations使用Graphql,那么它看起来就像是糟糕的设计。
GET请求不应更改服务器或数据库的状态,这已被确立为一种标准,大多数情况下,mutations用于更改某个或另一个状态(可能只有数据库,因为您的应用程序应该是无状态的)。
请注意,您也可以使用query方法来更改后端的状态,但是,同样,这将违背既定的标准,正如笔墨文档中所解释的那样。
..。在REST中,任何请求最终都可能对服务器造成一些副作用,但按照惯例,不使用GET请求来修改数据。GraphQL类似--从技术上讲,任何查询都可以实现以导致数据写入。但是,建立一种约定是有用的,即任何导致写入的操作都应该通过突变显式地发送。。
什么时候使用csrf_exempt装饰器是安全的?
为了给那些想知道摆脱默认CSRF支票有多糟糕的人提供提示,这里是我的两分解释。
当浏览器自动发送身份验证参数时,服务将暴露于CSRF攻击,默认的Django基于会话的身份验证系统就是这种情况。
如果只将Django应用程序用作API后端,则很可能依赖另一种身份验证机制,如DRF's TokenAuthentication或某种JWT实现。
基本上,这些身份验证系统不受CSRF攻击的影响,因为如果恶意网站希望代表您的用户访问您的服务器--这就是CSRF的全部内容--它将无法设置服务器所期望的- HTTP报头来实际验证请求(前提是您安全地将令牌存储在只能由您的前端应用程序域访问的cookie中.)。
tl;博士
继续使用GraphQL请求发送POST查询,这是最佳实践。
如果您的GraphQL端点只能由经过身份验证的用户访问,并且您的身份验证系统不依赖Django的会话,那么可以免除端点对CSRF的检查。
但是,如果您使用Django的默认身份验证系统csrf verification. --即存储在cookie中的sessionid,则必须在此时强制执行sessionid,您唯一的机会是,正如前面的答案所述,在您的HTTP请求中添加X-CSRFToken头,并将以前的请求自动设置的csrftoken cookie的值赋给服务器。
我最初在GitHub上发布了这个答案,但在这里我认为它也是有用的。
发布于 2020-05-10 00:07:58
您要寻找的是csrf_exempt在您的url(r'^graphql', csrf_exempt(GraphQLView.as_view(graphiql=True))),中
您可以像这样导入它:from django.views.decorators.csrf import csrf_exempt。
GraphQL端点不需要csrf令牌,因为它是一个API。
默认情况下,CSRF令牌在生产中是必需的,因为django不知道哪个POST请求是表单的,哪个不是。另外,CSRF在您只想在您的网站上使用GraphQL端点的情况下可能很有用(因此拥有令牌是一种额外的安全措施)。但是对于您来说,在生产中删除CSRF令牌检查是完全可以的。
发布于 2019-07-17 08:53:55
Var。1)设置头X-CSRFToken (也可以尝试X-CSRFTOKEN和csrftoken)

Var。( 2)不是很正确的解决办法,但它很容易&它有效!使用GET请求而不是POST的。不知怎么起作用了..。

或
Var。3) 也没有为我工作,也不工作。您可以尝试正确的方式添加到Cookie automaticly ( a)单击Cookie TAB (管理Cookie按钮c)动作->添加cookie P.S。实际上,失眠自动注入csrftoken,您可以尝试通常的REST,您会发现,它工作正常,并且有自动增加失眠的csrftoken .

https://stackoverflow.com/questions/51764452
复制相似问题