2016-03-08 15 views
6

私はこれについて多くを見てきましたが、何も問題を解決できません。Django 1.9 AJAXフォームCSRFトークン403エラー - 「CSRFクッキーが設定されていません」

問題:有効CSRFミドルウェアで

、Djangoは述べ、AJAXフォーム要求に403で応答: "CSRFクッキー設定されていません"

documentation後、JSの機能は、カスタム"X-CSRFToken"ヘッダーを設定している、実装されました。

また、期待どおりに動作AJAX要求とともにブラウザやポストそれをから"csrftoken"クッキーを取得します。

x-csrftoken: 1a0u7GCQG0wepZHQNThIXeYpMy2lZOf2 

しかし応答はまだ403

しようとしたソリューションです:

私はSOやウェブ上で見つけられるものをすべて試しました。具体的には

  • そのミドルウェアが有効になっているチェック:有効にクッキーと

    MIDDLEWARE_CLASSES = [ 
        ... 
        'django.middleware.common.CommonMiddleware', 
        'django.middleware.csrf.CsrfViewMiddleware', 
        'django.contrib.auth.middleware.AuthenticationMiddleware', 
        ... 
    ] 
    
  • 異なるブラウザを。

  • @ensure_csrf_cookieで私の意見を飾る;

  • テンプレートに{% csrf_token %}を設定してください。

  • 右の要求コンテキストを取るrenderショートカットを使用する。

  • settings.pyでカスタムCSRF_COOKIE_NAMECSRF_HEADER_NAMEを設定します。

  • CSRF_COOKIE_SECURE = FalseCSRF_COOKIE_HTTPONLY = Falseを明示的に設定します。

  • CSRF_TRUSTED_ORIGINSの設定を明示的に設定します。

  • 開発サーバーと運用サーバーのテスト。

  • でも、私の考えでは、誰かが示唆したように、request.META["CSRF_COOKIE_USED"] = Trueです。

まだ何も得られていません。

ヘッダ:

私は私の見解で@csrf_exemptprint(request.META)を使用する場合は、カスタムヘッダ「X-CSRFToken」がリクエストに存在し、「HTTP_」接頭辞で、Djangoのドキュメントに従ってフォーマットであることは明らかですハイフンをアンダースコアに置き換え、すべて大文字:"HTTP_X_CSRFTOKEN"

さらに、Djangoによって設定されたクッキーと一致します。

クッキー:私は私の見解でprint(request.COOKIES)にしようとした場合

奇妙なことは、私は「csrftoken」がクッキーを見ることができるページとフォーム負荷に、ですが、辞書はAJAX要求に空であります。問題になることはありますか?

実際に何が間違っているのが見逃せません。これを読んでいただきありがとうございます。 [OK]を

+0

):

fetch(formUrl, { ... credentials: 'same-origin', ... }) 

そして、あなたが行ってもいいでしょう:あなたは自分のfetch()関数の引数にsame-originを追加する必要がありますか? – Alasdair

+0

あなたはAJAXリクエストを送信するために何を使用していますか? jQuery? – Smile0ff

+0

@ Smile0ff:APIを取得します。 – Nevertheless

答えて

6

は、問題は、非常に簡単です:

取得APIはデフォルトで資格情報を送信していません。 MDNによると:リクエストインターフェイスの

資格情報読み取り専用のプロパティは、ユーザエージェントが に他のドメインからのクロスオリジン・リクエストの場合にクッキーを送信するかどうかを を示しています。これはXHRの Credentialsフラグと似ていますが、3つの値があります。

デフォルトはomitであり、決してクッキーを送信しません。あなたは、実際のビューとJavaScriptを表示することができ

関連する問題