python - 如何忽略发送到 Django REST Framework 的 CSRF token ?

标签 python django angularjs django-rest-framework django-csrf

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

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

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

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

我正在使用基于类的 View 来扩展 Django REST Framework 中的 View 集。我试图通过用 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)

最佳答案

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

如果你真的需要它,你可以把它移到默认类的底部。因为它正在检测身份验证 cookie,并且身份验证成功,SessionAuthentication 将在检查 JWT 之前失败。

关于python - 如何忽略发送到 Django REST Framework 的 CSRF token ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27299825/

相关文章:

python - 模拟 Celery 任务方法 apply_async

python - Django:如何将 QuerySet 转换为字符串

javascript - jquery 基于变量启用/禁用表单字段部分

angularjs - 如何在不知道 angular.element 的属性是否以数据或 x 数据为前缀的情况下读取它

python - 使用 geopy 将英里转换为纬度和经度

python - Django manytomany 字段,如何检查 80% 的子集/匹配项?

python Pandas : How to choose a certain option within duplicates

javascript - Angularjs响应$http返回问题

Python:优化数据帧处理

python - networkx:创建从边导出的子图