Umgang mit Cookies in PhoneGap / Cordova

88

Ich arbeite an einer PhoneGap-App mit Serversitzungsnutzung. Für die Sitzung sind Cookies erforderlich. Darüber hinaus sollte auch das Cookie vom Load Balancer verarbeitet werden. Es führt also kein Weg vorbei. Wie gehen Sie mit Cookies in Ihrer PhoneGap-App um?

Ich habe bereits einige Nachforschungen angestellt:

  • Einige sagen, dass die Behandlung von Cookies davon abhängen kann, 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 Auslösen von xhr-Anfragen funktioniert es.
  • Cookies können nach xhr-Anfrage mit xhr.getResponseHeader ('Set-Cookie') 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) -Anforderungen nicht zugewiesen und nicht aktualisiert.
  • Einige schlagen den localStorage vor, um Sitzungs-IDs usw. zu speichern. Alle Skripte können jedoch darauf zugreifen, und dies kann ein XSS-Sicherheitsproblem sein. Cookies umgehen dieses Problem mithilfe des httponly-Flags.
  • iOS: Es gibt einige Änderungen, die das WebView-Verhalten ändern, um Cookies zu unterstützen. 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.
Bernd
quelle
Was meinst du damit, dass alle Skripte auf localStorage zugreifen können? Ich dachte, es wäre für jede PhoneGap-App separat und irgendwie sandboxed ... nein?
Jayarjo
Vielleicht hilft dieses Plugin? github.com/assembly/cordova-cookie-jar
J Chris A

Antworten:

67

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

Kurzes Schlüsselbeispiel:

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

Set Item Quick Beispiel:

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

Schnelles Beispiel für Artikel

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

Artikel entfernen Kurzes Beispiel:

 window.localStorage.removeItem("key");

Klares Schnellbeispiel:

 window.localStorage.clear();

Wenn Sie Ihr Javascript sowohl für Mobilgeräte als auch für das Internet 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#localStorage http://cordova.apache.org/docs/en/6.x/cordova/storage/storage.html # page-toc-source

Beachten Sie: Wenn Sie die anonyme Navigation unter iOS verwenden, 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
            }
        }
    }
});
Tiago Gouvêa
quelle
1
Tiago, können Sie in Bezug auf Ihre Antwort bitte klären, ob die Option localStorage weiterhin besteht (es kommt zu keinem Datenverlust), bis die App deinstalliert wird? Können wir auch sagen, dass andere Apps mit Sicherheit kein Schlüssel-Wert-Paar erreichen können, das ich in meiner App festgelegt habe?
Shamaleyte
2
@shamaleyte "LocalStorage verhält sich eher wie ein Cache als wie ein Cookie, wobei die Persistenz jedes einzelnen von den Browsereinstellungen des Benutzers abhängt und davon, wie der Browser sie selbst implementiert (da es keine Spezifikationen dafür gibt)." stackoverflow.com/questions/9948284/…
Tiago Gouvêa
Bitte benutzen Sie NICHT localstorage in Cordova! Unter iOS kann der Systemprozess localstorage nach Belieben leeren. gonehybrid.com/…
Nico Westerdale
4

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

Was ich entdeckt habe, ist Folgendes:

  • Über AJAX gesetzte Cookies (zB jQuery) $.get() oder $.post()) bleiben nicht bestehen
  • In einem 'inAppBrowser' gesetzte Cookies tun dies bestehen bleiben.

Der Weg, um ein Cookie zum Fortbestehen zu bringen, ist die Verwendung von inAppBrowser- Plugin.

Richten Sie zunächst einen einfachen Server ein, der als GET-Parameter Schlüsselwertparameter akzeptiert, die Sie beibehalten möchten. Ich bin ein Python / Tornado-Typ, daher könnte mein Server folgendermaßen 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 Ihrer 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);
   }
);
Mike N.
quelle
3

Sie können die Sitzungs-ID auch an die anfordernde URL anhängen und abhängig von der Serveranwendungssprache Sitzungsdaten mit dem von Ihnen übergebenen Wert für die Sitzungs-ID der Abfragezeichenfolge abrufen. In PHP können Sie beispielsweise eine vorhandene Sitzung öffnen, indem Sie die Sitzungs-ID übergeben. Obwohl dies aufgrund des Risikos einer Sitzungsentführung nicht empfohlen wird, können Sie problemlos die IP-Adresse und den Browser testen, um sicherzustellen, dass die Sitzung vom selben Client stammt. Dies würde natürlich erfordern, dass Sie Ihre Sitzung ablaufen lassen, sobald der Client den Sitzungsbrowser schließt, und Sie daran hindern, Ansichten zwischenzuspeichern, da die Sitzung im eigentlichen HTML-Code enthalten wäre. Das Speichern von Daten auf dem lokalen Gerät ist für mich zumindest keine Option, da es dem Kunden zu viel aussetzt, was meiner Meinung nach ein weitaus größeres Sicherheitsrisiko darstellt.

Moderncode
quelle
Sie können es auch über eine Post-XmtHttpRequest senden, z. B. $.post()in jQuery, und dann eine lokale Variable festlegen. Wenn Sie alles verschlüsseln, ist das ziemlich sicher.
JVE999
@ JVE999 Wie verschlüssle ich Cookies, die standardmäßig in der Webansicht gespeichert werden?
LoveForDroid
3

Verwenden Sie die device_id, um bestimmte Datensätze auf der Serverseite zu adressieren. Erstellen Sie eine Datenbank Tabelle mit dem Namen sessionauf dem Server mit device_id, cookiename, cookievalueundtimestamp als Spalten.

Wenn ein Client über die Phonegap-App auf Ihren Webserver zugreift, holen Sie sich seine device_idund speichern Sie die Cookies in Ihrer Tabelle. Dasdevice_id here fungiert als Zugriffstoken im OAuth-Protokoll.

Aus Sicherheitsgründen müssen Sie jetzt die Gültigkeitsdauer dieser Datensätze verkürzen, da die Geräte-ID dauerhaft ist und Ihr Kunde eines Tages seine Telefone verkaufen möchte. Verwenden Sie daher, timestampum den letzten Zugriff des Clients zu speichern und den Datensatz zu löschen, wenn seit beispielsweise 10 Tagen nicht mehr darauf zugegriffen wurde.

Abdullah Al-Salloum
quelle
3

Ich verwende Cordova 6.1 (derzeit die neueste Version) und habe tatsächlich Folgendes gefunden:

Wenn ich das Cookie über Javascript mit document.cookie = ... setze, funktioniert es nicht. Wenn ich jedoch eine Funktion setCookie über Ajax mit einer Funktion wie an den Server sende

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 auf der Serverseite mit

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

dann funktioniert es tatsächlich!

Hoffe das hilft. Prost

SF
quelle
0

Hatte das gleiche Problem und entschied mich, evrth nach localStorage zu verschieben. Ich schrieb ein Plugin, damit Sie es auch verwenden können: Angular -Cookies-Mirror

uamanager
quelle
0

natürlich kannst du.

ionic App senden Sie einfach ein Ajax-Requset, Cookie funktioniert gut oder hängt nicht vom Server ab.

Ich habe Arbeit mit Python Django Server und Node Server, beide Cookie hat 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

Wangjinyang
quelle
0

Ich denke, die Frage betrifft 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.

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

Überprüfen Sie https://www.npmjs.com/package/cordova-plugin-cartegraph-cookie-master .

Es funktioniert einfach!

BruceJo
quelle
0

Ich hatte auch Probleme mit Sitzungscookies mit 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 withCredentials- Flag auf true gesetzt sein.

Moe
quelle