我有一个单页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之前会失败.
听起来你已经SessionAuthentication
启用了,这是Django REST Framework的一部分,它为基于cookie的身份验证实施CSRF.由于您使用的是JWT,并且您提到所有页面都使用JWT进行身份验证,因此您应该只能SessionAuthentication
从默认身份验证类列表中删除.
如果您确实需要它,可以将其移动到默认类的底部.因为它正在检测身份验证cookie,并且身份验证成功,所以SessionAuthentication
在检查JWT之前会失败.