2016-11-29 32 views
0

我正在開發一個角度的web應用程序,它將取代我們擁有的當前網站。當前網站使用基於會話的身份驗證。目前,我無法通過獲取或發佈請求訪問託管API。AngularJs + Django RESTful:基於會話的身份驗證

我正在使用python簡單服務器在本地計算機上開發角度應用程序,而api是在線託管的。

我寧願找到一個完全在角度上的修復,因爲我無法在沒有幫助的情況下更改API(它是前段時間由我的老闆編寫的,現在用於生產版本)。我沒有登錄頁面,所以我只是試圖在我的標題和請求中提供身份驗證信息。

我的角應用程序是獨立於django編寫的。我只是想訪問Django的後端

到目前爲止,我想下面設置標題:

app.config(['$httpProvider', function($httpProvider) { 
    $httpProvider.defaults.xsrfCookieName = 'csrftoken'; 
    $httpProvider.defaults.xsrfHeaderName = 'X-CSRFToken'; 
    $httpProvider.defaults.headers.common = {'username': btoa('myUsername'), 'password': btoa('myPassword') 
}; 
}]); 

在我的服務:

app.factory('Test', ['$resource', function($resource) { 
    return $resource('https://www.phonywebsite.org/en/api/test/') 
}; 

我一直得到301, 400和403錯誤。最近一直是301錯誤,我沒有得到API的迴應。我使用Allow CORS chrome擴展作爲臨時修復來嘗試訪問api而不會收到CORS策略錯誤。

我的問題

  1. 我該如何解決,而無需使用Chrome擴展CORS錯誤?

  2. 如何爲我的django後端使用基於會話的身份驗證提供身份驗證,確保其查找的csrf cookie位於標頭中?

回答

0

要回答你的第一個問題,使用CORS擴展是一個臨時的解決方案,應該主要是永遠不會被使用的原因你的客戶可能不會使用它。要處理CORS,您需要了解跨站點API調用的工作方式。簡而言之,CORS是一種允許AJAX請求規避相同原始限制的機制。要處理這種情況,您需要更新後端並添加

CORS_ORIGIN_ALLOW_ALL = True 
CORS_ALLOW_CREDENTIALS = True 

。一旦你添加了這個,你的settings.py應該停止獲取CORS問題。

要回答你的第二個問題,angular已經爲你提供了對CSRF的支持,所以你的一半戰鬥已經贏了。你需要做的是在你的模塊上添加一個補丁來開始接受csrf標記(這個名稱在角度上有點不同)。你已經做了這一點,並完成它的一個好工作,以及:

var app = angular.module('app', ['...']); 

app.config(['$httpProvider', function($httpProvider) { 
    $httpProvider.defaults.xsrfCookieName = 'csrftoken'; 
    $httpProvider.defaults.xsrfHeaderName = 'X-CSRFToken'; 
}]); 

這是什麼會做的是確保當你做出一個$ HTTP調用你的CSRF標記設置爲好。

作爲一種學習oppurtunity,你也可以嘗試使用ng-cookies。要進一步解釋這一點,無論何時以角度撥打電話,您的請求都與Cookie捆綁在一起,因此您可以在request.COOKIES中輕鬆訪問它們。

你需要改變你如何調用您的API爲好,這樣的:

app.factory('APIService', function ($http) { 
    return $http({url: 'https://www.phonywebsite.org/en/api/test/', 
       method: 'GET'}) 
} 

你可以明顯地進行修改,這一點,但我認爲,這顯示了$ HTTP使用,讓你瞭解大致要點。

你也可以嘗試在你的應用程序中添加更多認證(或者用你自己的自定義認證來替換django認證),但這是在你的用例中。

希望這會有所幫助。