Gestion des cookies dans PhoneGap / Cordova

je travaille sur une application PhoneGap avec l'utilisation de session de serveur. Il a besoin de cookies pour gérer la session. En outre, le cookie du Load balancer doit être manipulé, aussi. Donc, il n'y a pas moyen de contourner. Comment gérer les Cookies dans votre application PhoneGap?

j'ai déjà fait quelques recherches:

  • certains disent que le traitement des cookies pourrait dépendre du fait que le serveur ne paramétrait pas les cookies pour des agents utilisateurs inconnus (IIS): PhoneGap session (cookies) sur iOS
  • en JavaScript les cookies peuvent être configurés avec le document.cookie. = .., mais ils ne sont pas sauvés dans PhoneGap et perdus. Avant de tirer XHR demande qu'il fonctionne.
  • Les Cookies
  • peuvent être récupérés après la requête xhr avec xhr.getResponseHeader ('Set-Cookie'). Mais seulement lorsqu'il est activé sur le serveur. Malheureusement, jQuery supprime l'en-tête" Cookie".
  • le document JavaScript.témoin de la propriété n'est pas affecté et pas de mise à jour après les requêtes (xhr).
  • certains suggèrent le stockage local pour sauvegarder les ids 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: il y a quelques modifications qui vont changer le comportement de webView pour supporter 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 L'AppDelegate.m (v2.5).
79
demandé sur Community 2013-03-12 01:41:51

7 réponses

mon ami, j'ai essayé aussi sans succès d'utiliser des cookies avec phonegap. La solution était d'utiliser le stockage local.

Clé Rapide Exemple:

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

D'Éléments De Jeu Rapide Exemple:

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

Obtenir De L'Élément De Exemple Rapide

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

Supprimer L'Article Exemple Rapide:

 window.localStorage.removeItem("key");

Clair Exemple Rapide:

 window.localStorage.clear();

si vous utilisez javascript pour mobile et 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 d'une navigation anonyme sur iOS peut faire que localstorage ne fonctionne pas comme spected. 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
répondu Tiago Gouvêa 2016-07-28 21:26:03

vous pouvez aussi ajouter l'id de session à l'url demandée et selon le langage d'application du serveur, récupérer les données de session en utilisant la valeur de l'id de session de la chaîne de requête que vous avez passée - exemple en PHP vous pouvez ouvrir une session existante en passant dans l'id de session. Bien que cela ne soit pas recommandé en raison des risques de détournement de session, vous pouvez facilement tester pour L'IP et le navigateur pour s'assurer que la session vient du même client. Cela vous obligerait naturellement à expirer votre session dès que le client ferme le navigateur de session et vous limitera à la mise en cache des vues puisque la session sera 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 il expose trop au client qui est à mon avis un risque beaucoup plus grand de sécurité.

3
répondu moderncode 2013-06-06 11:28:14

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

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

  • les Cookies activés via AJAX (par exemple jQuery $.get() ou $.post() ) ne persistent pas
  • Cookies définis dans un "inAppBrowser" do persistent.

la façon d'obtenir ainsi un cookie pour persister est d'utiliser le inAppBrowser plugin.

tout d'abord, configurez un serveur simple qui accepte comme paramètres GET les paramètres key-value que vous voulez persister. Je suis un gars de Python / tornado, 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)

puis, 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);
   }
);
3
répondu Mike N 2015-12-07 10:53:54

utilisez le device_id pour traiter certains enregistrements côté serveur. Créez une table de base de données appelé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, récupérez son device_id et stockez les cookies dans votre table. Le device_id here Sert de jeton d'accès dans le protocole D'Auth.

maintenant, pour des raisons de sécurité, vous devez réduire la période de validité de ces enregistrements, parce que le device_id est pervers et que votre client voudrait vendre ses téléphones un jour. Par conséquent, utilisez timestamp pour stocker le dernier accès du client et supprimer le document s'il n'a pas été consulté depuis, disons 10 jours.

2
répondu Abdullah Al-Salloum 2014-08-24 17:03:05

J'utilise Cordova 6.1 (version la plus récente pour le moment) et en fait j'ai trouvé ce qui suit:

si je configure le cookie via Javascript en utilisant le document.cookie. = .. alors il 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 régler le cookie côté serveur en utilisant

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

alors ça marche vraiment!

J'espère que aider. Cheers

2
répondu S. F. 2016-11-27 10:05:48

avait le même problème, et a décidé de déplacer evrth à localStorage J'ai écrit plugin donc vous pouvez l'utiliser aussi: angular-cookies-miroir

0
répondu uamanager 2017-01-08 02:05:04

bien sûr que si.

application ionique il suffit d'envoyer un requset ajax, cookie fonctionne bien ou ne dépend pas du serveur.

j'ai travaillé avec Python Django server et node server, les deux cookies ont très bien fonctionné""

code de noeud en dessous de

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

api rest

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

ionique le code de l'application

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 ici

0
répondu wangjinyang 2017-08-24 07:52:25