Gestion des cookies dans PhoneGap / Cordova

88

Je travaille sur une application PhoneGap avec une utilisation de session serveur. Il a besoin de cookies pour gérer la session. De plus, le cookie de l'équilibreur de charge doit également être géré. Il n'y a donc pas moyen de contourner. Comment gérez-vous les cookies dans votre application PhoneGap?

J'ai déjà effectué quelques recherches:

  • Certains disent que la gestion des cookies peut dépendre du serveur ne définissant pas de cookies pour les agents utilisateurs inconnus (IIS): Session PhoneGap (cookies) sur iOS
  • En JavaScript, les cookies peuvent être définis avec document.cookie = ..., mais ils ne sont pas enregistrés dans PhoneGap et perdus. Avant de tirer les demandes xhr, cela fonctionne.
  • Les cookies peuvent être récupérés après une requête xhr avec xhr.getResponseHeader ('Set-Cookie'). Mais seulement lorsqu'il est réellement défini sur le serveur. Malheureusement, jQuery supprime l'en-tête "Cookie".
  • La propriété JavaScript document.cookie n'est pas attribuée et n'est pas mise à jour après les demandes (xhr).
  • Certains suggèrent localStorage pour enregistrer les identifiants de session, etc. Mais tous les scripts peuvent y accéder et cela peut être un problème de sécurité XSS. Les cookies contournent ce problème en utilisant l'indicateur httponly.
  • iOS: Il y a quelques modifications qui changeront le comportement de webView pour prendre en charge les cookies. Mais ils ne semblent pas fonctionner avec iOS 6 et PhoneGap 2.5: https://groups.google.com/forum/?fromgroups=#!topic/phonegap/ZJE1nxX63ow
  • Les cookies semblent être activés par défaut dans AppDelegate.m (v2.5).
Bernd
la source
Que voulez-vous dire que tous les scripts peuvent accéder à localStorage? Je pensais que c'était séparé et un peu bac à sable pour chaque application PhoneGap ... non?
jayarjo
Peut-être que ce plugin aide? github.com/assembly/cordova-cookie-jar
J Chris A

Réponses:

68

Ami, j'ai aussi essayé sans succès d'utiliser des cookies avec phonegap. La solution était d'utiliser localStorage.

Exemple rapide clé:

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

Exemple rapide d'élément défini:

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

Obtenir un exemple rapide d'article

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

Exemple de suppression d'élément rapide:

 window.localStorage.removeItem("key");

Effacer l'exemple rapide:

 window.localStorage.clear();

Si vous utilisez votre javascript pour le mobile et le Web, vous pouvez utiliser ce code pour détecter cet environnement:

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

Références: 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

Attention: l'utilisation de la navigation anonyme sur iOS peut empêcher le stockage local de fonctionner comme prévu. Un test simple qui fonctionne bien pour moi:

$(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
la source
1
Tiago, En ce qui concerne votre réponse, pourriez-vous s'il vous plaît clarifier si l'option localStorage persiste (aucune perte de données ne se produit) jusqu'à ce que l'application soit désinstallée? et aussi, pouvons-nous dire qu'il est certain que d'autres applications ne peuvent pas atteindre une paire clé-valeur que j'ai définie dans mon application?
shamaleyte
2
@shamaleyte "LocalStorage agit plus comme un cache que comme des cookies, où la persistance de chacun dépend des paramètres du navigateur de l'utilisateur et de la façon dont le navigateur lui-même l'implémente (car il n'y a pas de spécifications pour cela)" stackoverflow.com/questions/9948284/...
Tiago Gouvêa
Veuillez NE PAS utiliser de stockage local à Cordova! sous iOS, le processus système peut vider le stockage local à volonté. gohybrid.com
Nico Westerdale
4

Comme vous, je voulais utiliser des cookies définis par un serveur dans mon application afin que mon application soit cohérente avec le Web et ne nécessite pas un ID de périphérique distinct ou une autre méthode d'authentification.

Ce que j'ai découvert est le suivant:

  • Les cookies définis via AJAX (par exemple jQuery $.get()ou $.post()) ne persistent pas
  • Cookies dans un « inAppBrowser » ne persistent.

La façon de faire ainsi persister un cookie est d'utiliser le plugin inAppBrowser .

Tout d'abord, configurez un serveur simple qui accepte comme paramètre GET les paramètres clé-valeur que vous souhaitez conserver. Je suis un gars python / tornade, donc mon serveur pourrait ressembler à:

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

Ensuite, dans votre application:

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

Vous pouvez alors appeler cela comme suit:

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

Vous pouvez également ajouter l'ID de session à l'URL demandeuse et, en fonction de la langue de l'application du serveur, récupérer les données de session à l'aide de la valeur d'ID de session de la chaîne de requête que vous avez transmise - par exemple, en PHP, vous pouvez ouvrir une session existante en transmettant l'ID de session. Bien que cela ne soit pas recommandé en raison des risques de piratage de session, vous pouvez facilement tester l'adresse IP et le navigateur pour vous assurer que la session provient du même client. Cela nécessiterait bien sûr que vous expiriez votre session dès que le client ferme le navigateur de session et vous limiterait à la mise en cache des vues puisque la session serait incluse dans le html réel. Stocker des données sur l'appareil local pour moi au moins n'est pas vraiment une option car cela expose trop le client, ce qui représente à mon avis un risque de sécurité beaucoup plus grand.

code moderne
la source
Vous pouvez également l'envoyer via un post XmtHttpRequest, par exemple en utilisant $.post()dans jQuery, puis définir une variable locale. Si vous cryptez tout, c'est assez sûr.
JVE999
@ JVE999 comment crypter les cookies qui sont enregistrés par défaut par la vue Web?
LoveForDroid
3

Utilisez le device_idpour adresser certains enregistrements côté serveur. Créer une table de base de données nommée sessionsur votre serveur avec device_id, cookiename, cookievalueet timestampsous forme de colonnes.

Lorsqu'un client accède à votre serveur Web via l'application phonegap, récupérez le sien device_idet stockez les cookies dans votre table. Le device_id hereagit comme le jeton d'accès dans le protocole OAuth.

Désormais, pour des raisons de sécurité, vous devez réduire la période de validité de ces enregistrements, car le device_id est permanent et votre client voudrait vendre ses téléphones un jour. Par conséquent, utilisez timestamppour stocker le dernier accès par le client et supprimez l'enregistrement s'il n'a pas été consulté pendant, par exemple, 10 jours.

Abdullah Al-Salloum
la source
3

J'utilise Cordova 6.1 (la dernière version pour le moment) et j'ai trouvé ce qui suit:

Si je place le cookie via Javascript en utilisant document.cookie = ... alors cela ne fonctionne pas. Cependant si j'envoie une fonction setCookie via Ajax au serveur avec une fonction comme

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

et définissez le cookie côté serveur en utilisant

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

alors ça marche vraiment!

J'espère que cela t'aides. À votre santé

SF
la source
0

J'ai eu le même problème et j'ai décidé de déplacer evrth vers localStorage.J'ai écrit un plugin pour que vous puissiez l'utiliser également: angular-cookies-mirror

uamanager
la source
0

bien sûr vous pouvez.

l'application ionique envoie simplement un requset ajax, les cookies fonctionnent bien ou ne dépendent pas du serveur.

je travaille avec le serveur python Django et le serveur de nœuds, les deux cookies fonctionnaient très bien

code de nœud ci-dessous

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

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

code d'application ionique

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

vous pouvez vérifier mon code source ici

Wangjinyang
la source
0

Je pense que la question est fondamentalement de définir des cookies côté client pour une application cordova. La plupart des informations sur ce sujet impliquent que la configuration des cookies côté client ne fonctionne pas pour cordova.

Mais j'ai trouvé un plugin qui me permet de définir des cookies côté client pour mon application cordova.

Découvrez https://www.npmjs.com/package/cordova-plugin-cartegraph-cookie-master .

Cela fonctionne juste!

BruceJo
la source
0

J'ai également eu des problèmes de cookies de session avec les demandes Cordova + XHR. Les cookies sont perdus à chaque redémarrage de l'application. Deux choses ont résolu mes problèmes:

  1. Les cookies doivent avoir une date d'expiration.

  2. Toutes les demandes XHR doivent avoir l' indicateur withCredentials défini sur true.

Moe
la source