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:
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:
$.get()
ou $.post()
) ne persistent pas 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