it-swarm.com.de

Umgang mit Cookies in PhoneGap/Cordova

Ich arbeite an einer PhoneGap-App mit Serversitzung. Es benötigt Cookies, um die Sitzung abzuwickeln. Zusätzlich sollte auch der Cookie vom Load Balancer behandelt werden. So führt kein Weg vorbei. Wie gehen Sie mit Cookies in Ihrer PhoneGap-App um?

Ich habe bereits etwas recherchiert:

  • Einige sagen, die Cookie-Behandlung könnte davon abhängen, dass der Server keine Cookies für unbekannte Benutzeragenten (IIS) setzt: PhoneGap-Sitzung (Cookies) unter iOS
  • In JavaScript können Cookies mit document.cookie = ... gesetzt werden, sie werden jedoch nicht in PhoneGap gespeichert und gehen verloren. Vor dem Abfeuern von xhr-Anfragen funktioniert es.
  • Mit xhr.getResponseHeader ('Set-Cookie') können Cookies nach einer xhr-Anforderung abgerufen werden. Aber nur wenn tatsächlich auf dem Server eingestellt. Leider entfernt jQuery den "Cookie" -Header.
  • Die JavaScript-Eigenschaft document.cookie wird nach (xhr) -Anfragen nicht zugewiesen und nicht aktualisiert.
  • In einigen Fällen wird der localStorage zum Speichern von Sitzungs-IDs usw. empfohlen. Alle Skripts können jedoch darauf zugreifen und dies könnte ein XSS-Sicherheitsproblem sein. Cookies umgehen dieses Problem mit dem httponly-Flag.
  • iOS: Es gibt einige Änderungen, die das WebView-Verhalten zur Unterstützung von Cookies ändern. Sie scheinen jedoch nicht mit iOS 6 und PhoneGap 2.5 zu funktionieren: https://groups.google.com/forum/?fromgroups=#!topic/phonegap/ZJE1nxX63ow
  • Cookies scheinen in AppDelegate.m (v2.5) standardmäßig aktiviert zu sein.
81
Bernd

Freund, ich habe auch ohne Erfolg versucht, Cookies mit Phonegap zu verwenden. Die Lösung war localStorage. 

Key Quick Beispiel:

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

Set Item Quick Beispiel:

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

Holen Sie sich ein schnelles Beispiel 

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

Artikel entfernen Beispiel:

 window.localStorage.removeItem("key");

Schnelles Beispiel:

 window.localStorage.clear();

Wenn Sie Javascript für Mobil- und Webanwendungen verwenden, können Sie diesen Code verwenden, um diese Umgebung zu erkennen:

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

Referenzen: http://docs.phonegap.com/de/1.2.0/phonegap_storage_storage.md.html#localStoragehttp://cordova.Apache.org/docs/de /6.x/cordova/storage/storage.html#page-toc-source

Bitte beachten Sie: Durch die anonyme Navigation unter iOS funktioniert Localstorage möglicherweise nicht wie erwartet. Ein einfacher Test, der für mich gut funktioniert:

$(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
            }
        }
    }
});
64
Tiago Gouvêa

Ähnlich wie Sie wollte ich Cookies verwenden, die von einem Server in meiner Anwendung festgelegt wurden, damit meine App mit dem Web konsistent ist und keine separate Geräte-ID oder eine andere Authentifizierungsmethode erfordert.

Was ich entdeckt habe, ist folgendes:

  • Cookies, die über AJAX (z. B. jQuery $.get() oder $.post()) festgelegt wurden, bleiben nicht bestehen
  • In einem inAppBrowser gesetzte Cookies do bleiben bestehen.

Um einen Cookie dauerhaft zu erhalten, verwenden Sie das Plugin inAppBrowser .

Richten Sie zunächst einen einfachen Server ein, der als GET-Parameter eingegebene Schlüsselwertparameter akzeptiert, die Sie beibehalten möchten. Ich bin ein Python/Tornado-Typ, daher könnte mein Server so aussehen:

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

Dann in deiner 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);    
    });
}

Sie können dies dann wie folgt aufrufen:

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

Sie können die Sitzungs-ID auch an die anfragende URL anhängen und abhängig von der Sprache der Serveranwendung Sitzungsdaten mit dem von Ihnen übergebenen Abfragezeichenfolgen-ID-Wert abrufen. Beispiel: In PHP können Sie eine vorhandene Sitzung öffnen, indem Sie die Sitzung übergeben Ich würde. Dies ist zwar aufgrund der Risiken von Sitzungsentführungen nicht zu empfehlen, Sie können jedoch problemlos IP und Browser testen, um sicherzustellen, dass die Sitzung vom selben Client stammt. Dies setzt natürlich voraus, dass Sie Ihre Sitzung ablaufen lassen, sobald der Client den Sitzungsbrowser schließt, und Sie könnten die Ansichten nicht zwischenspeichern, da die Sitzung in der eigentlichen HTML-Datei enthalten wäre. Das Speichern von Daten auf dem lokalen Gerät ist für mich zumindest keine Option, da dies den Kunden zu sehr aussetzen kann, was meiner Meinung nach ein weitaus größeres Sicherheitsrisiko darstellt.

3
moderncode

Ich verwende Cordova 6.1 (aktuellste Version) und habe folgendes gefunden:

Wenn ich den Cookie über Javascript mit document.cookie = ... gesetzt habe, dann funktioniert es nicht. Wenn ich jedoch eine Funktion setCookie über Ajax mit einer Funktion an den Server schicke 

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=/"; 
    }
} 

und setzen Sie das Cookie serverseitig mit 

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

dann klappt es eigentlich! 

Hoffe, das hilft

2
S. F.

Verwenden Sie den device_id, um bestimmte Datensätze auf der Serverseite zu adressieren. Erstellen Sie auf Ihrem Server eine Datenbanktabelle mit dem Namen session mit device_id, cookiename, cookievalue und timestamp als Spalten.

Wenn ein Client über die Phonegap-App auf Ihren Webserver zugreift, rufen Sie seinen device_id ab und speichern Sie die Cookies in Ihrer Tabelle. Der device_id here fungiert im OAuth-Protokoll als Zugriffstoken.

Aus Sicherheitsgründen müssen Sie nun die Gültigkeitsdauer dieser Datensätze verkürzen, da die device_id permanent ist und Ihr Client eines Tages seine Telefone verkaufen möchte. Verwenden Sie daher timestamp, um den letzten Zugriff des Clients zu speichern, und löschen Sie den Datensatz, wenn auf ihn nicht innerhalb von 10 Tagen zugegriffen wurde.

2

Ich hatte auch Probleme mit Sitzungscookies bei Cordova + XHR-Anfragen. Die Cookies gehen bei jedem Neustart der App verloren. Zwei Dinge haben meine Probleme gelöst:

  1. Cookies müssen ein Ablaufdatum haben.

  2. Für alle XHR-Anforderungen muss das Flag withCredentials auf true gesetzt sein.

0
Moe

Hatte das gleiche Problem und beschloss, evrth in localStorage zu verschieben. Ich habe Plugin geschrieben, damit Sie es auch verwenden können: angle-cookies-mirror

0
uamanager

natürlich kannst du.

ionic App einfach ein Ajax Requset senden, funktionieren Cookies gut oder nicht vom Server abhängig.

ich habe mit Python Django Server und Node Server gearbeitet, beide Cookies haben sehr gut funktioniert

knotencode unten 

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

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

ionischer App-Code

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

Sie können meinen Quellcode hier überprüfen

0
wangjinyang

Ich denke, die Frage ist im Wesentlichen das Setzen von clientseitigen Cookies für eine Cordova-App. Die meisten Informationen zu diesem Thema implizieren, dass das Setzen von clientseitigen Cookies für Cordova nicht funktioniert.

Aber ich habe ein Plugin gefunden, mit dem ich clientseitige Cookies für meine Cordova-App setzen kann.

Check out https://www.npmjs.com/package/cordova-plugin-cartegraph-cookie-master .

Es funktioniert einfach!

0
BruceJo