web-dev-qa-db-fra.com

Gestion des cookies dans PhoneGap/Cordova

Je travaille sur une application PhoneGap avec une utilisation de session de serveur. Il a besoin de cookies pour gérer la session. De plus, le cookie de l'équilibreur de charge doit également être traité. 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 fait que le serveur ne configure pas de cookies pour des agents utilisateurs inconnus (IIS): Session PhoneGap (cookies) sur iOS
  • En JavaScript, les cookies peuvent être définis avec document.cookie = ..., mais ils ne sont ni enregistrés dans PhoneGap ni perdus. Avant de tirer les demandes XHR, cela fonctionne.
  • Les cookies peuvent être récupérés après une demande xhr avec xhr.getResponseHeader ('Set-Cookie'). Mais seulement quand effectivement placé 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 au localStorage de sauvegarder les identifiants de session, etc. Mais tous les scripts peuvent y accéder, ce qui peut poser un problème de sécurité XSS. Les cookies résolvent 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).
81
Bernd

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

Exemple rapide clé:

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

Exemple d'article rapide:

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

Exemple d'obtention rapide d'un article 

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

Supprimer un article exemple rapide:

 window.localStorage.removeItem("key");

Exemple rapide clair:

 window.localStorage.clear();

Si vous utilisez votre javascript pour le Web et le mobile, 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/fr/1.2.0/phonegap_storage_storage.md.html#localStoragehttp://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 stockage local de fonctionner correctement. 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
            }
        }
    }
});
64
Tiago Gouvêa

Comme pour vous, je souhaitais utiliser les cookies définis par un serveur au sein de mon application afin que celle-ci soit cohérente avec le Web et ne nécessite pas d'identifiant d'appareil distinct, ni 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
  • Les cookies définis dans un 'inAppBrowser' do persistent.

Le moyen de faire persister un cookie consiste à utiliser le plugin inAppBrowser .

Commencez par configurer un serveur simple qui accepte en tant que paramètre GET les paramètres clé-valeur que vous souhaitez conserver. Je suis un gars de type python/tornade, mon serveur peut donc 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 ensuite appeler cela comme suit:

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

Vous pouvez également ajouter l'identifiant de session à l'URL demandeuse et, selon la langue de l'application serveur, récupérer les données de la session à l'aide de la valeur de l'identifiant de session de chaîne de requête que vous avez transmise. Exemple: dans PHP, vous pouvez ouvrir une session existante en passant par la session id. Bien que cela ne soit pas recommandé en raison des risques de détournement 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 empêcherait de mettre en cache les vues car la session serait incluse dans le code HTML réel. Stocker des données sur le périphérique local pour moi au moins n’est pas vraiment une option, car cela expose trop au client, ce qui, à mon avis, représente un risque de sécurité bien plus important.

3
moderncode

J'utilise Cordova 6.1 (la version la plus récente pour le moment) et j'ai trouvé les éléments suivants:

Si je crée un cookie via Javascript avec document.cookie = ..., 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 à l'aide de 

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

alors cela fonctionne réellement! 

J'espère que cela aide .

2
S. F.

Utilisez le device_id pour adresser certains enregistrements côté serveur. Créez une table de base de données nommée session sur votre serveur avec device_id, cookiename, cookievalue et timestamp comme colonnes.

Lorsqu'un client accède à votre serveur Web via l'application phonegap, obtenez son device_id et stockez les cookies dans votre tableau. Le device_id here fait office de jeton d'accès 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 device_id est permanent et votre client souhaite vendre ses téléphones un jour. Par conséquent, utilisez timestamp pour stocker le dernier accès du client et supprimez l'enregistrement s'il n'a pas été consulté pendant 10 jours, par exemple.

2
Abdullah Al-Salloum

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 le marqueur withCredentials défini sur true.

0
Moe

Avait le même problème, et a décidé de passer tous les disques à localStorage J'ai écrit le plugin afin que vous puissiez l'utiliser aussi: angular-cookies-mirror

0
uamanager

bien sûr vous pouvez.

ionic app suffit d'envoyer un requset ajax, cookie fonctionne bien ou ne dépend pas du serveur.

j'ai travaillé avec le serveur Django et le serveur de nœuds Python. Les deux cookies ont très bien fonctionné.

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.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

0
wangjinyang

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.

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

Ça marche!

0
BruceJo