2014-12-04 119 views
7

我有一个页面angularjs应用程序利用JWT身份验证。由于JWT是随每个请求一起发送的,因此在我的表单中使用CSRF令牌似乎是多余的。为了禁用CSRF检查,我在settings.py中间件类中注释了'django.middleware.csrf.CsrfViewMiddleware'。这一切工作正常。如何忽略发送给Django REST框架的CSRF令牌?

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

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

我可以配置我的应用程序不设置CSRF Coo​​kie,但如何配置我的应用程序忽略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) 
+0

[Django Rest Framework删除csrf]的可能重复(http://stackoverflow.com/questions/30871033/django-rest-framework-remove-csrf) – user3467349 2016-05-26 06:52:37

回答

13

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

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

+0

就是这样!谢谢! – 2014-12-04 19:28:30

相关问题