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:
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
}
}
}
});
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:
$.get()
ou $.post()
) ne persistent pasLe 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);
}
);
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.
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 .
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.
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:
Les cookies doivent avoir une date d'expiration.
Toutes les demandes XHR doivent avoir le marqueur withCredentials défini sur true.
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
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)
});
}
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!