2014-12-04 109 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