web-dev-qa-db-ja.com

POST可能なAPIとDjangoのCSRFミドルウェアを持つ

Django webappには、フロントエンドのWebアクセス可能なコンポーネントとデスクトップクライアントからアクセスされるAPIの両方があります。ただし、新しいCSRFミドルウェアコンポーネントを使用すると、 POSTされたデスクトップクライアントは403を取得します。

なぜこれが起こっているのか理解していますが、セキュリティを損なうことなくこれを修正する適切な方法は何ですか?どういうわけか、それがAPIリクエストであり、DjangoがCSRFをチェックするべきではない、またはそれは悪い戦略であるということをHTTPヘッダーで通知できますか?

編集-

私が現在使用している方法は、デスクトップクライアントがヘッダーX-Requested-With:XMLHttpRequestを設定することです。これはちょっとハッキーですが、これがどのようにうまく処理されるかはわかりません。

32
T. Stone

デスクトップクライアントのビューを分割して、 csrf_exempt で装飾するのはどうですか?

10
Brian Luft

クラスベースビューを使用している場合は、次のようなpostメソッドではなくdispatchメソッドをcsrf_exemptする必要があります。

@method_decorator(csrf_exempt)
def dispatch(self, request, *args, **kwargs):
    return super(MyView, self).dispatch(request, *args, **kwargs)

このバグチケットを参照してください: https://code.djangoproject.com/ticket/15794

8
Adam Spence