2013-05-17 65 views
13

我正在使用django rest框架通過IOS執行API調用 ,並且出現以下錯誤 「CSRF失敗:未設置CSRF cookie」。Django REST框架CSRF失敗:未設置CSRF cookie

這裏是我的Django API代碼:

class LoginView(APIView): 
    """ 
    List all snippets, or create a new snippet. 
    """ 
    @csrf_exempt 
    def get(self, request, format=None): 
     startups = Startup.objects.all() 
     serializer = StartupSerializer(startups, many=True) 
     return Response(serializer.data) 

    @csrf_exempt 
    def post(self, request, format=None): 
     profile = request.POST 
.... 

我能做些什麼?

+0

你有沒有想過這個?我從來沒有超過這個。 – user798719

+0

[Django Rest Framework刪除csrf]的可能重複(http://stackoverflow.com/questions/30871033/django-rest-framework-remove-csrf) – user3467349

回答

1

對於GET,您不應該修改數據,因此不需要CSRF。

如果您使用的是POST修改數據,那麼你應該,如果你使用的是基於會話的認證有CSRF。否則,你正在打開一個安全漏洞。即使您認爲您的Django服務器將服務於iPhone應用程序,也沒有什麼能夠阻止某人用您的應用程序嗅探您的服務器上的流量數據包,然後使用其他類型的Web客戶端逆向工程訪問服務器。出於這個原因,在某些情況下,Django Rest Framework需要一個CSRF。這在Django rest framework documentation中提到。

有關此POST要求的路徑是不使用會話身份驗證。例如,您可以通過HTTPS使用BasicAuthentication。使用這種身份驗證機制,您應該使用HTTPS來防止每次請求都以明文方式傳遞憑據。

+0

>我們的應用程序從嗅探流量上的數據包 - https,所以沒有這不是原因。 – user3467349

+0

如果您可以關閉禁用CSRF的風險,因爲您不覺得您的數據包不安全,並且沒有涉及瀏覽器,您應該嘗試@Rahul Gupta-Iwasaki –

11

如果有人依然遵循着這個問題,直接的答案是,你需要使用裝飾上的觀點方法本身。在APIView類中定義只是告訴DRF實際的觀點應該如何表現的getpost方法,但Django的路由器預計不實際實例,直到調用LoginView.as_view()視圖方法。

因此,解決方案是將csrf_exempt修飾器添加到urls.py。它可能如下所示:

​​

但是,正如Mark指出的那樣,csrf保護對於防止會話被劫持很重要。我自己並沒有與iOS一起工作,但我會考慮使用django的cookie-based csrf tokens。您可以使用ensure_csrf_cookie裝飾,使Django的發送csrftoken的cookie的響應,只要你包括令牌作爲X-CSRFToken頭你POST請求將驗證。

0

這是一個老問題,但我們最近遇到了一些問題。

DRF默認禁用CSRF,除非使用會話認證。默認情況下,NSURLconnection設置爲處理cookie。您需要明確告訴iOS應用程序不使用Cookie。然後,如果需要,您可以繼續使用會話身份驗證,而無需csrf免除您的視圖。

1

您在這裏遇到的問題是,處理您的視圖的django使用任何as_view()方法將返回,而不是直接方法get()post()

因此,你應該裝點您的基於類的視圖中的下列方式之一:

  1. 在URL中。PY
 
    urlpatterns = patterns('', 
     url('^login/$', csrf_exempt(views.LoginView.as_view())), 
     ... 
    ) 
  • 或上dispatch()方法(預django的1.9)
  •  
        from django.utils.decorators import method_decorator 
    
        class LoginView(APIView): 
         @method_decorator(csrf_exempt) 
         def dispatch(self, *args, **kwargs): 
          ... 
    
  • 或類視圖本身(從django的1.9)
  •  
        from django.utils.decorators import method_decorator 
    
    
        @method_decorator(csrf_exempt, name='dispatch') 
        class LoginView(APIView): 
          ... 
    
    0

    我有同樣的問題。我的問題是,我忘了,但.as_view()MyAPIView urls.py。因此,它需要像:

    url(r'$', GetLikesAPI.as_view(), name='list') 
    

    不是:

    url(r'$', GetLikesAPI, name='list') 
    
    相關問題