Gestione dei cookie in PhoneGap / Cordova


88

Sto lavorando a un'app PhoneGap con utilizzo della sessione del server. Ha bisogno di cookie per gestire la sessione. Inoltre, dovrebbe essere gestito anche il cookie del sistema di bilanciamento del carico. Quindi non c'è modo di aggirare. Come gestisci i cookie nella tua app PhoneGap?

Ho già svolto alcune ricerche:

  • Alcuni dicono che la gestione dei cookie potrebbe dipendere dal server che non imposta i cookie per agenti utente sconosciuti (IIS): Sessione PhoneGap (cookie) su iOS
  • In JavaScript i cookie possono essere impostati con document.cookie = ..., ma non vengono salvati in PhoneGap e persi. Prima di sparare richieste xhr funziona.
  • 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 localStorage di 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).

Cosa vuoi dire che tutti gli script possono accedere a localStorage? Pensavo fosse separato e un po 'sandbox per ogni app PhoneGap ... no?
jayarjo


Risposte:


68

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

Esempio rapido chiave:

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

Impostazione rapida di un articolo:

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

Ottieni un esempio rapido dell'articolo

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

Rimuovi articolo Esempio rapido:

 window.localStorage.removeItem("key");

Chiaro esempio rapido:

 window.localStorage.clear();

Se utilizzi javascript sia per dispositivi mobili che per Web, puoi utilizzare questo codice per rilevare quell'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'utilizzo della navigazione anonima su iOS potrebbe impedire che localstorage funzioni come visto. Un semplice test che funziona 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, in merito alla tua risposta, potresti chiarire se l'opzione localStorage persiste (non si verifica alcuna perdita di dati) fino a quando l'app non viene disinstallata? e inoltre, possiamo dire che è sicuro che altre app non possono raggiungere una coppia chiave-valore che ho impostato nella mia app?
shamaleyte

2
@shamaleyte "LocalStorage agisce più come una cache piuttosto che come cookie, in cui la persistenza di ciascuno dipende dalle impostazioni del browser dell'utente e da come il browser stesso lo implementa (poiché non ci sono specifiche per esso)" stackoverflow.com/questions/9948284/…
Tiago Gouvêa

Si prega di NON utilizzare localstorage a Cordova! in iOS il processo di sistema può scaricare localstorage a piacimento. gohybrid.com/…
Nico Westerdale

4

Simile a te, volevo 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:

  • I cookie impostati tramite AJAX (ad esempio jQuery $.get()o$.post() ) non persistono
  • Cookie impostati in un 'inAppBrowser' non persistono.

Il modo per far sì che un cookie persista è utilizzare inAppBrowser plugin .

Innanzitutto, configura un semplice server che accetti come parametro GET i parametri valore-chiave che desideri mantenere. Sono un tipo python / tornado, quindi il mio server potrebbe assomigliare a:

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

Quindi, 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);    
    });
}

Puoi quindi chiamarlo come segue:

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

3

È inoltre possibile aggiungere l'ID di sessione all'URL richiedente e, a seconda della lingua dell'applicazione del server, recuperare i dati della sessione utilizzando il valore dell'ID di sessione della stringa di query passato - ad esempio in PHP è possibile aprire una sessione esistente passando l'ID di sessione. Sebbene ciò non sia consigliato a causa dei rischi di dirottamento della sessione, puoi facilmente testare l'IP e il browser per assicurarti che la sessione provenga dallo stesso client. Ciò ovviamente richiederebbe la scadenza della sessione non appena il client chiude il browser della sessione e limiterebbe la memorizzazione nella cache delle visualizzazioni poiché la sessione sarebbe inclusa nell'html effettivo. La memorizzazione dei dati sul dispositivo locale almeno per me non è davvero un'opzione in quanto espone troppo al client che è a mio parere un rischio per la sicurezza molto maggiore.


Puoi anche inviarlo tramite un post XmtHttpRequest, ad esempio usando $.post()in jQuery, quindi impostare una variabile locale. Se crittografa tutto, è abbastanza sicuro.
JVE999

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

3

Utilizzare device_idper indirizzare determinati record sul lato server. Creare una tabella database denominato sessionsul server con device_id, cookiename, cookievalueetimestamp come colonne.

Quando un client accede al tuo server web tramite l'app phonegap, prendi il suo device_ide memorizza i cookie nella tua tabella. Ildevice_id here funge da token di accesso nel protocollo OAuth.

Ora, per motivi di sicurezza, è necessario ridurre il periodo di validità di tali record, poiché device_id è permanente e il tuo cliente vorrebbe vendere i propri telefoni un giorno. Pertanto, usatimestamp per memorizzare l'ultimo accesso da parte del client ed eliminare il record se non vi si accede da, diciamo 10 giorni.


3

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

Se imposto il cookie tramite Javascript utilizzando document.cookie = ... allora non funziona. Tuttavia, se invio 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 lato server utilizzando

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

allora funziona davvero!

Spero che sia di aiuto. Saluti



0

certo che puoi.

L'app ionic invia semplicemente un requset ajax, i cookie funzionano bene o non dipendono dal server.

ho lavorato con il server python Django e il server del nodo, entrambi i cookie hanno funzionato molto bene

codice nodo di seguito

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();
});

resto api

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 ionico

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)
  });
}

puoi controllare il mio codice sorgente qui


0

Penso che la domanda sia fondamentalmente sull'impostazione dei cookie lato client per un'app Cordova. La maggior parte delle informazioni su questo argomento implica che l'impostazione dei cookie lato client non funziona per cordova.

Ma ho trovato un plug-in che mi consente di impostare i cookie lato client per la mia app cordova.

Dai un'occhiata a https://www.npmjs.com/package/cordova-plugin-cartegraph-cookie-master .

Funziona e basta!


0

Ho anche avuto problemi con i cookie di sessione con le richieste Cordova + XHR. I cookie vengono persi a ogni riavvio dell'app. Due cose hanno risolto i miei problemi:

  1. I cookie devono avere una data di scadenza.

  2. Tutte le richieste XHR devono avere il flag withCredentials impostato su true.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.