2016-11-15 56 views
1

連接到服務器的Django我們有這個設置:允許同一用戶從客戶端Angular2和其他Django的服務器

  • 中央Django的服務器,CSRF和登錄啓用。除登錄之外,如果沒有先前登錄,可能不會執行任何操作。
  • 一個Angular2客戶端,它幾乎可以將每個呼叫都連接到中央服務器。中央服務器上的登錄從此處執行。 CSRF令牌可用且身份驗證正常。
  • 另一個需要文件的小型服務器。它也是Django,但不支持CSRF。客戶端將文件發送到中央服務器可能永遠不會擁有或甚至看不到的服務器。文件上傳(使用表單數據和POST)工作正常。但是,文件上傳完成後,我們希望這個小型服務器調用中央服務器,通知它上傳成功。

問題是最後一步。中央服務器拒絕通話,表示我們需要登錄。我們能否以任何方式讓中央服務器相信請求來自使用Angular2客戶端登錄的用戶?我們如何設置CSRF令牌?我們將他在客戶端獲得的用戶CSRF令牌發送給小型服務器。

我們正在使用python-requests庫,Python 3和Django 1.10。 這是我們目前擁有的小型服務器上的代碼:我認爲問題是「頭」的定義

url = settings.CENTRAL_SERVER_URL + 'path/to/endpoint' 

# 'request' is the original request object from the Angular2 client 
token = get_token(request) 

# Call to 'post' results in error code in response ('not logged in') 
response = requests.post(url, data=data, headers={'X-CSRFToken': token, 'Referer': url}) 

。它可以完成嗎?

(CSRF啓用=使用CsrfViewMiddleware)

回答

0

事實證明我是正確的軌道上。包含客戶端在登錄時也獲得的會話ID以及對中央服務器的新請求是最重要的。
下面是代碼:

url = settings.CENTRAL_SERVER_URL + 'path/to/endpoint' 

http_x_token = request.META['HTTP_X_CSRFTOKEN'] 
csrftoken = request.COOKIES['csrftoken'] 
session_id = request.COOKIES['sessionid'] 

response = requests.post(url, data=data, 
    headers={'X-CSRFToken': http_x_token, 'Referer': url}, 
    cookies={'csrftoken': csrftoken, 'sessionid': session_id}) 

會話ID應該總是存在於來自客戶端的請求。
Django中的SessionMiddleware檢查了這一點。如果會話ID存在,則可以找到用戶,並且其他所有操作都可以像我從客戶端發出請求一樣工作。

相關問題