2017-02-13 20 views
0

私はlocalhost:8000にバックエンドサーバーを、localhost:3000にフロントエンドサーバーを持っています。バックエンドはDjangoです。私はcorsheadersパッケージをインストールしていますが、私は問題なしでGETリクエストを作成します。サイトを開くと、最初のGETリクエストでCSRFトークンが正常に設定されます(devツールでCookieを見ることができます)。Django CSRFクロスサイトAJAXの問題

私はsettings.pyでこれを持っている:

CORS_ORIGIN_WHITELIST = (
    'localhost:3000' 
) 

CORS_ALLOW_METHODS = (
    'DELETE', 
    'GET', 
    'OPTIONS', 
    'PATCH', 
    'POST', 
    'PUT' 
) 

CORS_ALLOW_HEADERS = (
    'accept', 
    'accept-encoding', 
    'authorization', 
    'content-type', 
    'dnt', 
    'origin', 
    'user-agent', 
    'x-csrftoken', 
    'x-requested-with', 
) 

CSRF_TRUSTED_ORIGINS = (
    'localhost:3000', 
) 

CORS_ALLOW_CREDENTIALS = True 

は、今私はPOSTリクエストを作成しようとしていると私は常にサーバによって断ってる:

403 - Forbidden (CSRF cookie not set.): /myapp/myview/ 

、これはあります私のJSの様子:

let csrftoken = utils.getCookie('csrftoken'); // logged this on the console, the token is really here 

jQuery.ajaxSetup({ 
    beforeSend: function(xhr, settings) { 
    xhr.setRequestHeader("X-CSRFToken", csrftoken); 
    } 
}); // this might be wrong - I did read it is used only if it's not cross site, but I still gave it a try 

jQuery.ajax({ 
    url: url, 
    type: 'POST', 
    data: {attr: value, csrfmiddlewaretoken: csrftoken} 
})... 

私はAJAXデータでcsrfmiddlewaretokenを使ってみました。私はリクエストヘッダを設定するだけで試しました。私は両方を試しました。まだ運がありません。私は明らかに何かが欠けている。私はこれまで、サイト間でDjangoでPOSTを試したことがありません。

提案がありますか?

編集:私は問題が他のところにあることを発見しました。

+0

チェックこのhttps://github.com/ottoyiu/django-cors-headers –

+0

@ PiyushS.Wanare私はすでにジャンゴ・CORS-ヘッダを使用していたが、今はCORS_ALLOW_HEADERS/METHODS、CSRF_TRUSTED_ORIGINSとして、私の設定を拡張しましたCORS_ALLOW_CREDENTIALS、それでも動作しません、私は同じエラーメッセージが表示されます。 – dnmh

+0

問題は他の場所にあることが判明しましたか?あなたはその情報に向けて私たちを指摘したり、質問を終わらせることはできますか? – waterproof

答えて

0

AjaxリクエストのヘッダーにXSRFトークンを入れてみます。

$.ajax({ 
     url : urlToCall, // the endpoint 
     type : "POST", // http method 
     headers: { "X-CSRFToken": "your token here" }, 
     success : function(response) { 
      console.log('success', response); 
       }, 
      error : function(xhr,errmsg,err) { 
       console.log(xhr.status + ": " + xhr.responseText); // provide a bit more info about the error to the console 
      } 
    }); 
+0

いいえ、今試してみました: -/ – dnmh

0

私がそれを行うことができました:

$.ajax({ 
    url : urlToCall, // the endpoint 
    type : "POST", // http method 
    data : { 
     csrfmiddlewaretoken: "Your token", 
     data... 
    }, 

    success : function(response) { 
     console.log('success', response); 
      }, 
     error : function(xhr,errmsg,err) { 
      console.log(xhr.status + ": " + xhr.responseText); // provide a bit more info about the error to the console 
     } 
}); 

はそれが役に立てば幸い!

+0

いいえ、それは私が投稿した質問の私の例と基本的に同じです。 – dnmh

関連する問題