我的Android上的phonegapp应用程序有一点问题,python-django作为后端。当我关闭应用程序时,我丢失了服务器在身份验证后设置的所有cookie(sessionid和csrftoken)。 因此,每次打开应用程序时,我都必须执行登录过程。我尝试将sessionid保存在localStorage中,然后创建自己的标头,但XMLHttpRequest规范不允许这样做。我需要一个简单的锻炼来做这样的事情:
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 :(得分:0)
在处理移动设备时,您真的应该使用不同的身份验证方法。尝试基于令牌的身份验证要容易得多。基本上,您的移动应用程序上有一个表单,其中包含用户名/密码,并将其传递给您设计的视图以确保有效性,然后使用应用程序可以包含在所有后续调用中的令牌进行响应。
您可以使用自定义身份验证后端在Django中轻松实现此功能,或者您可以使用内置它的Django Rest Framework http://www.django-rest-framework.org/api-guide/authentication#tokenauthentication。
答案 1 :(得分:0)
你正在做的事情肯定是可能的。在XMLHttpRequest对象上设置cookie是不可能的。但是,如果您首先使用document.cookie
设置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存储在localstorage中,如果您的应用程序有XSS漏洞,攻击者可能会获取localstorage会话ID并使用JSONP或图像标记等将其发送到服务器。由于您使用的是phonegap,因此可以缓解使用whitelist policy只会允许请求转到已知服务器的问题。