2013-03-11 21 views
74

Sto lavorando a un'app PhoneGap con l'utilizzo della sessione del server. Ha bisogno di cookie per gestire la sessione. Inoltre, deve essere gestito anche il cookie dal servizio di bilanciamento del carico. Quindi non c'è modo di aggirare. Come gestisci i cookie nell'app PhoneGap?Gestione dei cookie in PhoneGap/Cordova

Ho già compiuto alcune ricerche:

  • Alcuni dicono che la gestione dei cookie potrebbe dipendere dal server non impostare i cookie per gli interpreti sconosciuti (IIS): PhoneGap session (cookies) on iOS
  • In cookie JavaScript può essere impostata con il documento. cookie = ..., ma non vengono salvati in PhoneGap e persi. Prima di licenziare xhr richiede che funzioni.
  • I cookie possono essere recuperati dopo la richiesta xhr con xhr.getResponseHeader ('Set-Cookie'). Ma solo quando effettivamente impostato sul server. Sfortunatamente, jQuery rimuove l'intestazione "Cookie".
  • La proprietà JavaScript document.cookie non viene assegnata e non viene aggiornata dopo (xhr) richieste.
  • Alcuni suggeriscono il localStorage per salvare gli ID di sessione ecc. Ma tutti gli script possono accedervi e questo potrebbe essere un problema di sicurezza XSS. I cookie risolvono questo problema utilizzando il flag httponly.
  • iOS: Ci sono alcune modifiche che cambieranno il comportamento di WebView per supportare i cookie. Ma sembrano non funzionare con iOS 6 e PhoneGap 2.5: https://groups.google.com/forum/?fromgroups=#!topic/phonegap/ZJE1nxX63ow
  • I cookie sembrano essere abilitati per impostazione predefinita in AppDelegate.m (v2.5).
+0

Che cosa si intende quando tutti gli script possono accedere a localStorage? Ho pensato che fosse separato e un po 'in modalità sandbox per ogni app PhoneGap ... no? – jayarjo

+0

Qui: http://stackoverflow.com/questions/15184567/is-local-storage-for-a-phonegap-app-on-an-android-device-separate-from-the-built – jayarjo

+0

Forse questo plugin aiuta? https://github.com/assembly/cordova-cookie-jar –

risposta

62

Amico, anche io ho provato senza successo a utilizzare i cookie con PhoneGap. La soluzione era usare localStorage.

chiave rapido esempio:

var keyName = window.localStorage.key(0); 

Set Articolo rapida Esempio:

window.localStorage.setItem("key", "value"); 

Get Elemento Esempio rapida

var value = window.localStorage.getItem("key"); 
// value is now equal to "value" 

Rimuovi Articolo rapida Esempio:

window.localStorage.removeItem("key"); 

chiaro esempio rapida:

window.localStorage.clear(); 

Se si utilizza JavaScript sia per mobile e web, è possibile utilizzare questo codice per rilevare che ambiente:

var wl = window.location.href; 
var mob = (wl.indexOf("android")>0); 

Riferimenti: http://docs.phonegap.com/en/1.2.0/phonegap_storage_storage.md.html#localStorage http://cordova.apache.org/docs/en/6.x/cordova/storage/storage.html#page-toc-source

Attenzione: l'uso della navigazione anonima su iOS può rendere lo spazio locale non funzionante come spectato. Un semplice test che stanno lavorando bene per me:

$(document).ready(function() { 
    try { 
     localStorage.setItem('test', '1'); 
    } catch (Err) { 
     if (Err.message.indexOf('QuotaExceededError') > -1) { 
      // Tell the user they are in anonymous mode 
      // Sugest it to go to https://support.apple.com/pt-br/HT203036 to get help to disable it 
      } 
     } 
    } 
}); 
+1

Tiago, Per quanto riguarda la tua risposta, potresti chiarire se l'opzione localStorage persiste (non si verificano perdite di dati) finché l'app non viene disinstallata? e inoltre, possiamo affermare che è sicuro che altre app non possano raggiungere una coppia chiave-valore che ho impostato nella mia app? – shamaleyte

+2

@shamaleyte "LocalStorage agisce più come cache piuttosto che come cookie, in cui la persistenza di ciascuno dipende dalle impostazioni del browser dell'utente e da come viene implementato dal browser stesso (poiché non ci sono specifiche per esso)" http://stackoverflow.com/ domande/9948284/how-persistent-is-localstorage –

+0

Si prega di NON utilizzare localstorage in Cordova! in iOS il processo di sistema può svuotare a piacimento localstorage. https://gonehybrid.com/dont-assume-localstorage-will-always-work-in-your-hybrid-app/ –

3

È anche possibile aggiungere l'id di sessione per l'url richiesta e in base alla lingua applicazione server, recuperare i dati di sessione utilizzando il valore id di sessione stringa di query avete passato - ad esempio in PHP puoi aprire una sessione esistente passando l'id della sessione.Anche se questo non è raccomandato a causa dei rischi del dirottamento di sessione, puoi facilmente testare l'IP e il Browser per assicurarti che la sessione provenga dallo stesso client. Ciò ovviamente richiederebbe scadere la sessione non appena il client chiude il browser di sessione e limiterebbe le visualizzazioni nella cache poiché la sessione verrebbe inclusa nell'html effettivo. Memorizzare i dati sul dispositivo locale almeno per me non è un'opzione in quanto espone troppo al cliente, il che è a mio avviso un rischio per la sicurezza molto maggiore.

+0

Puoi anche inviarlo tramite un messaggio XmtHttpRequest, come usare '$ .post()' in jQuery, quindi impostare una variabile locale. Se si cripta tutto, è abbastanza sicuro. – JVE999

+0

@ JVE999 come crittografare i cookie che vengono salvati per impostazione predefinita dalla visualizzazione Web? – LoveForDroid

2

Utilizzare il device_id di affrontare alcuni record sul lato server. Creare una tabella database denominato session sul server con device_id, cookiename, cookievalue e timestamp come colonne.

Quando un client accede al server Web tramite l'app phonegap, scaricare il suo device_id e memorizzare i cookie nella tabella. Lo device_id here funge da token di accesso nel protocollo OAuth.

Ora, per motivi di sicurezza è necessario per ridurre il periodo di validità di tali atti, perché il device_id è permenant e il vostro cliente vorrebbe vendere i loro telefoni un giorno. Pertanto, utilizzare timestamp per memorizzare l'ultimo accesso da parte del client ed eliminare il record se non è stato effettuato l'accesso, ad esempio 10 giorni.

3

Analogamente a te, desideravo utilizzare i cookie impostati da un server all'interno della mia applicazione in modo che la mia app fosse coerente con il Web e non richiedesse un ID dispositivo separato o un altro metodo per l'autenticazione.

Quello che ho scoperto è il seguente:

  • cookie impostati tramite la tecnologia AJAX (ad esempio jQuery $.get() o $.post()) non persistono
  • Cookies tutto immerso in un 'inAppBrowser' fare persistono.

Il modo per ottenere la permanenza di un cookie consiste nell'utilizzare il plug-in inAppBrowser.

In primo luogo, l'installazione di un semplice server che accetta come parametri chiave-valore dei parametri GET che si desidera a persistere. Sono un ragazzo di pitone/tornado, quindi il mio server potrebbe essere simile:

class PersistCookieHandler(tornado.web.RequestHandler): 
    @tornado.gen.coroutine 
    def get(self): 
     token = self.get_argument('token') 
     self.set_secure_cookie('token',token) 

Poi, nella tua app:

function persistToken(token,success_cb, error_cb) { 
    // replace with your URL 
    url = 'SECURE_SERVER_URL_THAT_HANDLES_SET_COOKIE'; 

    // _blank tells inAppBrowser to load in background (e.g., invisible) 
    var ref = window.open(url, '_blank', 'location=no,toolbar=no'); 

    // attach a listener to the window which closes it when complete 
    ref.addEventListener('loadstop', function(event) { 
     ref.close(); 
     success_cb(); // call our success callback 
    }); 

    // attach a listener for server errors 
    ref.addEventListener('loaderror', function(event) { 
     // call our error callback 
     error_cb(event);  
    }); 
} 

È quindi possibile chiamare questo come segue:

persistToken(
    someToken, 
    function() { 
     console.log("token persisted"); 
    }, 
    function() { 
     console.log("something went wrong); 
    } 
); 
2

Sto usando Cordova 6.1 (la versione più recente al momento) e in realtà ho trovato il seguente:

Se imposto il cookie tramite Javascript utilizzando docu ment.cookie = ... quindi non funziona. Tuttavia, se mando una funzione setCookie tramite Ajax al server con una funzione come

function setCookie(name, value, exdays) { 

    if(isPhonegap() === true){ 
     var data = "typ=function&functionType=setCookie&name="+name+"&value="+value+"&exdays="+exdays; 
     loadAjax(data, false);  
    } 
    else if (!(document.cookie.indexOf("name") >= 0)){ 
      var expires; 
      if (exdays) { 
       var date = new Date(); 
       date.setTime(date.getTime()+(exdays*24*60*60*1000)); 
       expires = "; expires="+date.toGMTString(); 
      } 
      else{ 
       expires = ""; 
      } 
      document.cookie = name+"="+value+expires+"; path=/"; 
    } 
} 

e impostare il cookie sul lato server utilizzando

setcookie($cookie, $value, $expires , "/"); 

poi lo fa in realtà funziona!

Spero che questo aiuti. Acclamazioni

0

avuto lo stesso problema, e ha deciso di trasferirsi a evrth localStorage ho scritto plugin in modo è possibile utilizzarlo anche: angular-cookies-mirror

0

naturalmente è possibile.

app ionica basta inviare un requset ajax, cookie funzionano bene o non dipendono dal server.

Ho del lavoro con Python Server Django e il server del nodo, sia biscotto lavorato molto bene

codice nodo sotto

app.all('*', function(req, res, next) { 
res.header("Access-Control-Allow-Origin", '*'); 
res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept"); 
res.header("Access-Control-Allow-Methods","PUT,POST,GET,DELETE,OPTIONS"); 
res.header("Access-Control-Allow-Credentials",true); 
next(); 
}); 

API REST

router.get('/setCookies', function(req, res, next) { 
var now = new Date(); 
var nextYear=new Date(now.setFullYear(now.getFullYear()+1)); 
//you can change the cookie key and value by your self here 
res.cookie('cookiesTest', 'set cookies success,your cookies can be set by server', { expires: nextYear, httpOnly: true }); 
res.status(200) 
res.end('SET COOKIES SUCCESS') 
}); 

router.get('/getCookies', function(req, res, next) { 
res.status(200) 
res.end(JSON.stringify(req.cookies)) 
}); 

codice app ionica

var server='http://[YOUR IP HERE]:3000' 

$scope.setCookies=function() { 
    $http({ 
    url: server + '/setCookies', 
    method: 'GET' 
    }).success(function (data, header, config, status) { 
    alert('set cookies success,look console') 
    $scope.setCookiesStatu=false 
    console.log(data) 
    $scope.cookiesValue=data 
    }).error(function (data, header, config, status) { 
    alert('set cookies error,check console or your server address is wrong') 
    console.log(data) 
    }); 
} 

$scope.getCookies=function() { 
    $http({ 
    url: server + '/getCookies', 
    method: 'GET' 
    }).success(function (data, header, config, status) { 
    alert('get cookies success,look console') 
    console.log(data) 
    $scope.cookiesValue=data 
    }).error(function (data, header, config, status) { 
    alert('get cookies error,check console or your server address is wrong') 
    console.log(data) 
    }); 
} 

you can check my sourse code here