2014-03-29 102 views
0

我在這個主題上做了大量的研究,但它仍然不適合我。 我在Django中設置了我的csrftoken cookie,並且它在響應對象中執行。Angular無法從Django獲取CSRF cookie

但在任何瀏覽器中,它說:no cookies in this site

後端:

@ensure_csrf_cookie 
def home(request): 
    csrf_token = get_token(request) 
    response = HttpResponse() 
    response = render(request, 'index.html') 
    response.set_cookie(key='csrftoken', value=csrf_token) 
    return response 

角:

myapp.config(function($httpProvider){ 
    //I use this when in angular1.0.x 
    //$http.defaults.headers.post['X-CSRFToken'] = $cookies['csrftoken']; 
    //now in angular1.2.x I use code below. but none of them works 
    $httpProvider.defaults.xsrfCookieName = 'csrftoken'; 
    $httpProvider.defaults.xsrfHeaderName = 'X-CSRFToken'; 
}); 

當我做一個職位,我得到消息

Failed to load resource: the server responded with a status of 403 (FORBIDDEN) 

而且如果我 打印頭信息在$ HTTP錯誤功能:

console.log(header('Set-Cookie')); 
console.log(header('Access-Control-Allow-Headers')); 
console.log(header('Access-Control-Allow-Methods')); 

所有這三個都是null

我不明白爲什麼!尤其是,它在Firefox或Chrome中工作正常,但在Apache服務器中,在此站點中始終沒有cookie。

有沒有我應該做的setting?任何人都可以幫我解決這個問題嗎?

+0

所以這個問題可能與如何定義你的apache來存儲cookie有關。查看['mod_session_cookie'文檔](https://httpd.apache.org/docs/trunk/mod/mod_session_cookie.html) – yuvi

+0

謝謝yuvi,快速回放。這只是我在Bluehost上使用共享託管服務器。我對服務器端來說很新,所以我現在應該檢查什麼?謝謝。 – flyaway

+0

實際上,如果您使用的是託管服務,那麼這樣一個簡單的問題,例如忘記允許使用Cookie等是不太可能的。所以我們回頭看看你自己的代碼。我也猜測這個問題與角度有關,而不是django。你見過[類似的情況下的這個答案](http://stackoverflow.com/a/18159276/2387772)? – yuvi

回答

0

我不確定這會有所幫助,但您的觀點寫得非常糟糕。你試圖以五種不同的方式強制csrf,並且你也有一些冗餘行不做任何事情(你做response = HttpResponse(),然後完全覆蓋它,使該行完全無效)。所以很有可能他們中的一個人正在搞砸事情。

的一點是 - 當你使用渲染你不需要做別的強制執行CSRF(你知道,除了確保它的啓用)。 That's the point of using it over render_to_response。試試這個更簡單的版本,看看它有多大幫助:

def home(request): 
    return render(request, 'index.html') 
+0

謝謝Yuvi 。其實,這就是我在發現問題之前編寫我的代碼的方式。在互聯網上查找後,我將我的代碼更改爲我在上面發佈的代碼,以確保在響應對象中包含csrf標記。我再次嘗試了你的代碼,仍然無法工作。你認爲這會涉及到Apache的配置?非常感謝你! – flyaway

+0

@flyaway我不完全確定...你必須提供一些額外的信息。你可以添加你做POST請求的實際部分嗎? – yuvi

0

嘗試,包括在應用程序中ngCookies模塊。

myApp.run(function ($http, $cookies) { 
    $http.defaults.headers.common['X-CSRFToken'] = $cookies.csrftoken; 
});