如何忽略发送到 Django REST 框架的 CSRF 令牌?

Posted

技术标签:

【中文标题】如何忽略发送到 Django REST 框架的 CSRF 令牌?【英文标题】:How does one ignore CSRF tokens sent to Django REST Framework? 【发布时间】:2015-02-02 16:11:55 【问题描述】:

我有一个使用 JWT 身份验证的单页 angularjs 应用程序。因为每次请求都会发送 JWT,所以在我的表单中使用 CSRF 令牌似乎是多余的。为了禁用 CSRF 检查,我在我的 settings.py 中间件类中注释掉了“django.middleware.csrf.CsrfViewMiddleware”。这一切都很好。

但是,当我使用 Django 管理面板时,使用的是 CSRF。这似乎是合理的,因为 JWT 不保护管理页面。

当我登录 Admin 时,会设置一个包含 CSRF 令牌的 cookie。当我在登录到管理会话时尝试从我的 angularjs 应用程序 POST 到 REST 端点时,请求包含 CSRF cookie,并且 Django REST 后端以 403 状态拒绝 POST。如果我从浏览器设置中删除 cookie 并重新发布,它会按预期通过。

我可以将我的应用程序配置为不设置 CSRF cookie,但是如果 CSRF cookie 是由同一域中的另一个应用程序设置的,我如何配置我的应用程序以忽略它?我不能保证令牌不会被其他东西设置,因为我不控制将在域上运行的所有应用程序。

我正在使用基于类的视图来扩展 Django REST 框架中的视图集。我试图通过用 csrf_exempt 装饰我的课程来解决这个问题,但这似乎不起作用(仍然得到 403 响应)。我可能做错了,还是我缺少其他解决方案?

这是我对 csrf_exempt 的尝试:

class AccountList(generics.ListCreateAPIView):
    serializer_class = serializers.AccountSerializer

    def get_queryset(self):
        return models.Account.objects.all()

    @method_decorator(csrf_exempt)
    def dispatch(self, *args, **kwargs):
        return super(AccountList, self).dispatch(*args, **kwargs)

【问题讨论】:

Django Rest Framework remove csrf的可能重复 【参考方案1】:

听起来你启用了SessionAuthentication,这是 Django REST 框架的一部分,它强制 CSRF 进行基于 cookie 的身份验证。由于您使用的是 JWT,并且您提到所有页面都使用 JWT 进行身份验证,您应该能够从默认身份验证类列表中删除 SessionAuthentication

如果你真的需要它,你可以把它移到默认类的底部。因为是检测认证cookies,认证成功,SessionAuthentication会在JWT被检查之前失败。

【讨论】:

就是这样!谢谢!

以上是关于如何忽略发送到 Django REST 框架的 CSRF 令牌?的主要内容,如果未能解决你的问题,请参考以下文章

你如何在 django rest 框架中实现 CSRF 令牌?

Django Rest 框架数据表删除

使用 React 和 Django Rest 框架的多步表单处理

如何在 django REST 框架中修改 request.data

无法使用 Django Rest 框架发送压缩的 gzip 数据

如何使用邮递员测试 Django REST 框架登录保护 API?