gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 20:12:25 25 4
gpt4 key购买 nike

我有一个使用 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com