28

django rest フレームワークを使用して IOS 経由で API 呼び出しを実行していますが、「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
....

私に何ができる?

4

7 に答える 7

21

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

したがって、解決策はcsrf_exemptデコレータをに追加することurls.pyです。次のようになります。

#file: urls.py

from django.conf.urls import patterns, url
from django.views.decorators.csrf import csrf_exempt

import views

urlpatterns = patterns('',
    url('^login/$', csrf_exempt(views.LoginView.as_view())),
    ...
)

ただし、Mark が上で指摘したように、セッションがハイジャックされるのを防ぐには、csrf 保護が重要です。私は自分で iOS を使用したことはありませんが、django のCookie ベースの csrf tokensの使用を検討します。デコレーターを使用してensure_csrf_cookie、django にcsrftoken応答と共に Cookie を送信させることができます。そのトークンをヘッダーPOSTとして含める限り、要求は検証されます。X-CSRFToken

于 2014-11-19T19:15:29.050 に答える
3

GET の場合、データを変更するべきではないため、CSRF は必要ありません。

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

POST のこの要件を回避する方法は、セッション認証を使用しないことです。たとえば、HTTPS 経由で BasicAuthentication を使用できます。この認証メカニズムでは、HTTPS を使用して、すべての要求で資格情報が平文で渡されるのを防ぐ必要があります。

于 2013-07-31T03:57:23.987 に答える
3

これは古い質問ですが、最近出くわしたものです。

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

于 2015-08-17T15:51:06.607 に答える