Gestion des cookies dans PhoneGap / Cordova

Je travaille sur une application PhoneGap avec 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é. Donc, il n’y a pas moyen de contourner. Comment gérez-vous les cookies dans votre application PhoneGap?

J’ai déjà effectué des recherches:

  • Certains disent que la gestion des cookies peut dépendre du serveur ne définissant pas les cookies pour les agents utilisateurs inconnus ( session 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 lancer les requêtes xhr, cela fonctionne.
  • Les cookies peuvent être récupérés après une requête xhr avec xhr.getResponseHeader (‘Set-Cookie’). Mais seulement lorsque réellement défini sur le serveur. Malheureusement, jQuery supprime l’en-tête “Cookie”.
  • La propriété JavaScript document.cookie n’est pas affectée et n’est pas mise à jour après les requêtes (xhr).
  • Certains suggèrent que le localStorage sauvegarde les identifiants de session, etc. Mais tous les scripts peuvent y accéder et cela pourrait être un problème de sécurité XSS. Les cookies contournent ce problème en utilisant le drapeau httponly.
  • iOS: Certaines modifications vont modifier 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).

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

Exemple de clé rapide:

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

Exemple rapide:

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

Exemple rapide d’object

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

Supprimer un exemple rapide d’article:

  window.localStorage.removeItem("key"); 

Effacer l’exemple rapide:

  window.localStorage.clear(); 

Si vous utilisez 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

Sachez que l’utilisation de la navigation anonyme sur iOS peut empêcher le fonctionnement de localstorage 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 } } } }); 

Vous pouvez également append l’ID de session à l’URL du demandeur et, en fonction de la langue de l’application serveur, récupérer les données de session en utilisant la valeur de l’identifiant de session que vous avez transmise. Par exemple, vous pouvez ouvrir une session existante en transmettant l’identifiant de session. Bien que cela ne soit pas recommandé en raison des risques de détournement de session, vous pouvez facilement tester l’IP et le navigateur pour vous assurer que la session provient du même client. Cela exigerait bien sûr que vous expiriez votre session dès que le client ferme le navigateur de session et vous limiterait aux vues de mise en cache puisque la session serait incluse dans le HTML actuel. Stocker des données sur le périphérique local pour moi au moins n’est pas vraiment une option car cela expose trop le client, ce qui constitue à mon avis un risque de sécurité beaucoup plus important.

Semblable à vous, je souhaitais utiliser des cookies définis par un serveur dans mon application pour que mon application soit cohérente avec le Web et ne nécessite pas d’ID d’appareil ou d’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
  • Les cookies définis dans un ‘inAppBrowser’ persistent.

La manière de faire persister un cookie consiste à utiliser le plug- in inAppBrowser .

Tout d’abord, configurez un serveur simple qui accepte les parameters de valeur-clé du paramètre GET que vous souhaitez conserver. Je suis un python / tornado, donc mon serveur peut 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 (eg, 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 ceci comme suit:

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

Utilisez le device_id pour traiter certains enregistrements du côté serveur. Créez une table de firebase database nommée session sur votre serveur avec device_id , cookiename , cookievalue et timestamp tant que colonnes.

Lorsqu’un client accède à votre serveur Web via l’application phonegap, obtenez son device_id et stockez les cookies dans votre table. device_id here agit device_id here comme jeton d’access dans le protocole OAuth.

Maintenant, pour des raisons de sécurité, vous devez réduire la période de validité de ces enregistrements, car le paramètre device_id est permanent et votre client souhaite vendre ses téléphones un jour. Par conséquent, utilisez l’ timestamp pour stocker le dernier access par le client et supprimez l’enregistrement s’il n’a pas été accédé, disons 10 jours.

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

Si je mets le cookie via Javascript en utilisant document.cookie = … alors ça ne marche 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.toGMTSsortingng(); } else{ expires = ""; } document.cookie = name+"="+value+expires+"; path=/"; } } 

et définir le cookie du côté du serveur en utilisant

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

alors ça marche vraiment!

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

A eu le même problème, et a décidé de passer à LocalStorage j’ai écrit le plugin pour que vous puissiez l’utiliser aussi:

bien sûr vous pouvez.

application ionique juste envoyer un requset ajax, bon travail de cookie ou ne pas dépendre du serveur.

J’ai travaillé avec le serveur python Django et le serveur de noeud, les deux cookies fonctionnaient très bien

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

repos 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.ssortingngify(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 sourse ici