2014-05-07 134 views
2

我在Android上使用python-django作爲後端時遇到了一個小問題。當我關閉應用程序時,我失去了服務器在驗證後設置的所有cookie(sessionid和csrftoken)。 因此,每次我打開應用程序,我都必須執行登錄過程。我嘗試將sessionid保存在localStorage中,然後創建自己的頭文件,但XMLHttpRequest規範不允許這樣做。我需要做這樣的事情一個簡單的鍛鍊:電話應用程序關閉後Cookie不會持續存在

function get_csrf_token(){ 
    $.ajax({ 
    url:"http://www.mywebsite.com/token", 
    type:"GET", 
    dataType:"text", 
    beforeSend: function(request) { 
     request.setRequestHeader("Cookie", 'sessionid=' + window.localStorage["sessid"]); 
    }, 

    error: function(XMLHttpRequest, textStatus, errorThrown) { 
     alert(JSON.stringify(XMLHttpRequest)); 
     alert(JSON.stringify(textStatus)); 
     alert(JSON.stringify(errorThrown)); 
    }, 
    success: function (token) { 
     window.localStorage["token"] = token; 
     return token; 
    } 
    }); 
} 

這是不可能性與PhoneGap的或我要登錄我每次啓動應用程序?

回答

0

在處理手機時,您真的很想使用不同的身份驗證方法。嘗試基於令牌的身份驗證要容易得多。基本上,您的移動應用程序中會有一個表單,它會接受用戶名/密碼並將其傳遞給您設計的視圖,以確保其有效性,然後使用該應用程序可以在所有後續調用中包含的令牌進行響應。

您可以在Django實現這個帶有自定義認證後端相當容易,或者你可以使用Django的REST框架http://www.django-rest-framework.org/api-guide/authentication#tokenauthentication有它內置的。

0

你在做什麼是絕對有可能。在XMLHttpRequest對象上設置cookie是不可能的。但是,如果您首先使用document.cookie來設置Cookie,則它將在每個後續請求的cookie標頭上發送。

function get_csrf_token(){ 
    document.cookie = 'sessionid=' + window.localStorage["sessid"]; 
    $.ajax({ 
    url:"http://www.mywebsite.com/token", 
    type:"GET", 
    dataType:"text", 
    ... 
    }); 
} 

您在做這件事時唯一要注意的是XSS攻擊的可能性。通過將會話ID存儲在本地存儲中,如果您的應用程序存在XSS漏洞,攻擊者可能會獲取本地存儲會話ID並使用JSONP或圖像標記等將其發送到他們的服務器。由於您使用phonegap,因此可以減輕通過使用whitelist policy這個問題將只允許請求去你已知的服務器。

相關問題