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

 tuuowu 发布于 2022-12-07 17:53

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

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

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

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

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

Kevin Brown.. 15

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

如果您确实需要它,可以将其移动到默认类的底部.因为它正在检测身份验证cookie,并且身份验证成功,所以SessionAuthentication在检查JWT之前会失败.

1 个回答
  • 听起来你已经SessionAuthentication启用了,这是Django REST Framework的一部分,它为基于cookie的身份验证实施CSRF.由于您使用的是JWT,并且您提到所有页面都使用JWT进行身份验证,因此您应该只能SessionAuthentication从默认身份验证类列表中删除.

    如果您确实需要它,可以将其移动到默认类的底部.因为它正在检测身份验证cookie,并且身份验证成功,所以SessionAuthentication在检查JWT之前会失败.

    2022-12-11 03:11 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有