2013-05-17 10 views
13

django restフレームワークを使用してIOS でAPIコールを実行していますが、次のエラーが発生します。 "CSRF Failed:CSRF cookieが設定されていません。Django REST Framework CSRFが失敗しました:CSRFクッキーが設定されていません

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 
.... 

私は何をすることができます。

は、ここに私のDjangoのAPIコードですか?

+0

あなたはこれを理解しましたか?私はこれを過ぎたことはありません。 – user798719

+0

[Django Rest Framework remove csrf](http://stackoverflow.com/questions/30871033/django-rest-framework-remove-csrf) – user3467349

答えて

1

GETの場合は、データを変更しないでください。したがって、CSRFは必須ではありません。

POSTでデータを変更する場合、セッションベースの認証を使用している場合は、CSRFが必要です(SHOULD)。それ以外の場合は、セキュリティホールを開いています。あなたのDjangoサーバはiPhoneアプリのサービスを提供すると考えていますが、あなたのアプリを持っている人があなたのサーバへのトラフィックのパケットを傍受してから、他の種類のWebクライアントとサーバへのエンジニアリングアクセスをリバースすることを止めるものは何もありません。このため、Django Rest FrameworkではCSRFが必要な場合があります。これはDjango rest framework documentationに記載されています。

この要件を回避するためのパスは、セッション認証を使用しないことです。たとえば、HTTPS経由でBasicAuthenticationを使用できます。この認証メカニズムを使用すると、HTTPSを使用して、すべての要求でクレデンシャルがクリアに転送されないようにする必要があります。

+0

>トラフィックのパケットをスニッフィングすることからの可能な複製 - https、noそれは理由ではありません。 – user3467349

+0

パケットが安全でなく、ブラウザーに関係していないと感じないのでCSRFを無効にする危険がある場合は、@ Rahul Gupta-Iwasaki –

11

誰でもこの質問に従っている場合は、ビューメソッド自体でデコレータを使用する必要があるという直接的な答えがあります。 getpostメソッドはAPIViewクラスで定義されているだけで、実際のビューの動作方法はDRFに指示されますが、LoginView.as_view()を呼び出すまで、djangoルータが期待するビューメソッドは実際にはインスタンス化されません。

したがって、解決策はurls.pycsrf_exemptデコレータを追加することです。これは次のようになります。マークは、上記の指摘するように

​​

ただし、CSRF保護が乗っ取られてからセッションを防止することが重要です。私は自分自身でiOSで作業していませんが、私はdjangoのcookie-based csrf tokensを使用して調べます。 ensure_csrf_cookieデコレータを使用すると、djangoがcsrftokenのCookieを返信し、POSTリクエストは、そのトークンをX-CSRFTokenヘッダーとして含める限り検証されます。

0

これは古い質問ですが、最近遭遇したことです。

セッション認証を使用しない限り、DRFはデフォルトでCSRFを無効にします。デフォルトでNSURLconnectionはクッキーを処理するように設定されています。 Cookieを使用しないようにiOSアプリに明示する必要があります。次に、必要に応じてセッション認証を使用し続けることができ、csrfでビューを免除する必要はありません。

1

あなたはここで発生した問題は、あなたのビューを処理するためのDjangoはas_view()方法は、直接法get()post()、ない返されます何でも使用していることです。 URLで

  1. したがって、あなたは、次のいずれかの方法で、クラスベースのビューを飾る必要があります。PY

 
    urlpatterns = patterns('', 
     url('^login/$', csrf_exempt(views.LoginView.as_view())), 
     ... 
    ) 
  • 又はdispatch()方法(プレジャンゴ1.9)に
  •  
        from django.utils.decorators import method_decorator 
    
        class LoginView(APIView): 
         @method_decorator(csrf_exempt) 
         def dispatch(self, *args, **kwargs): 
          ... 
    
  • またはクラスビューに自体(ジャンゴ1.9から)
  •  
        from django.utils.decorators import method_decorator 
    
    
        @method_decorator(csrf_exempt, name='dispatch') 
        class LoginView(APIView): 
          ... 
    
    0

    私は同じ問題を抱えていました。私の問題は、MyAPIViewにあるurls.pyの.as_view()を忘れていたことでした。私は最後にスラッシュなし=「http://example.com/list/5」をURLに入れて要求を送信したので、それが起こった

    url(r'$', GetLikesAPI, name='list') 
    
    0

    私の場合:

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

    ない:だからそれは次のようにする必要があります。私がurl = 'http://example.com/list/5/'に変更したとき、すべて動作するようになりました。

    関連する問題