Manejo de cookies en PhoneGap / Cordova

Estoy trabajando en una aplicación PhoneGap con el uso de la sesión del servidor. Necesita cookies para manejar la sesión. Además, también se debe manejar la cookie del equilibrador de carga. Entonces no hay forma de evitarlo ¿Cómo manejas las cookies en tu aplicación PhoneGap?

Ya he realizado algunas investigaciones:

  • Algunos dicen que el manejo de cookies podría depender de que el servidor no establezca cookies para agentes de usuario desconocidos (IIS): sesión de PhoneGap (cookies) en iOS
  • En JavaScript las cookies se pueden configurar con document.cookie = …, pero no se guardan en PhoneGap y se pierden. Antes de ejecutar solicitudes xhr, funciona.
  • Las cookies se pueden recuperar después de la solicitud xhr con xhr.getResponseHeader (‘Set-Cookie’). Pero solo cuando está realmente configurado en el servidor. Desafortunadamente, jQuery elimina el encabezado “Cookie”.
  • La propiedad document.cookie de JavaScript no se asigna y no se actualiza después de solicitudes (xhr).
  • Algunos sugieren que localStorage guarde los identificadores de sesión, etc. Pero todos los scripts pueden acceder y esto podría ser un problema de seguridad de XSS. Las cookies solucionan este problema utilizando el indicador httponly.
  • iOS: hay algunas modificaciones que cambiarán el comportamiento de webView para admitir cookies. Pero parece que no funcionan con iOS 6 y PhoneGap 2.5: https://groups.google.com/forum/?fromgroups=#!topic/phonegap/ZJE1nxX63ow
  • Las cookies parecen estar habilitadas por defecto en AppDelegate.m (v2.5).

Amigo, también intenté sin éxito usar cookies con phonegap. La solución fue usar localStorage.

Ejemplo rápido clave:

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

Establecer ejemplo rápido de artículo:

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

Obtener ejemplo rápido del artículo

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

Eliminar ejemplo rápido del artículo:

  window.localStorage.removeItem("key"); 

Borrar el ejemplo rápido:

  window.localStorage.clear(); 

Si usa javascript para dispositivos móviles y web, puede usar este código para detectar ese entorno:

 var wl = window.location.href; var mob = (wl.indexOf("android")>0); 

Referencias: 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

Tenga en cuenta que el uso de navegación anónima en iOS puede hacer que el almacenamiento local no funcione como se esperaba. Una prueba simple que me funciona bien:

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

También puede agregar el ID de la sesión a la url solicitante y dependiendo del idioma de la aplicación del servidor, obtenga los datos de la sesión utilizando el valor de la identificación de sesión de cadena de consulta que pasó. Por ejemplo, en PHP puede abrir una sesión existente al pasar la identificación de la sesión. Si bien esto no se recomienda debido a los riesgos del secuestro de sesión, puede probar fácilmente la dirección IP y el navegador para asegurarse de que la sesión proviene del mismo cliente. Esto, por supuesto, requeriría que expire su sesión tan pronto como el cliente cierre el navegador de la sesión y le limitaría el almacenamiento en caché de las vistas, ya que la sesión se incluiría en el html real. Almacenar datos en el dispositivo local para mí al menos no es realmente una opción, ya que expone demasiado al cliente, que en mi opinión es un riesgo de seguridad mucho mayor.

Al igual que usted, quería utilizar las cookies establecidas por un servidor dentro de mi aplicación para que mi aplicación fuera coherente con la web y no requiriera un ID de dispositivo por separado u otro método para la autenticación.

Lo que descubrí es lo siguiente:

  • Las cookies establecidas a través de AJAX (por ejemplo, jQuery $.get() o $.post() ) no persisten
  • Las cookies establecidas en un ‘inAppBrowser’ persisten.

La forma de lograr que una cookie persista es utilizar el complemento inAppBrowser .

En primer lugar, configure un servidor simple que acepte como parámetro GET el valor-clave del parámetro que desea persistir. Soy un tipo de python / tornado, por lo que mi servidor podría verse así:

 class PersistCookieHandler(tornado.web.RequestHandler): @tornado.gen.coroutine def get(self): token = self.get_argument('token') self.set_secure_cookie('token',token) 

Luego, en tu aplicación:

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

A continuación, puede llamar a esto de la siguiente manera:

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

Use device_id para abordar ciertos registros en el lado del servidor. Cree una tabla de base de datos llamada session en su servidor con device_id , cookiename , cookievalue y timestamp como columnas.

Cuando un cliente accede a su servidor web a través de la aplicación phonegap, obtenga su device_id y almacene las cookies en su mesa. El device_id here actúa como el token de acceso en el protocolo OAuth.

Ahora, por razones de seguridad, debe reducir el período de validez de esos registros, ya que device_id es permanente y su cliente querrá vender sus teléfonos un día. Por lo tanto, utilice la timestamp de timestamp para almacenar el último acceso del cliente y elimine el registro si no se ha accedido durante, por ejemplo, 10 días.

Estoy usando Cordova 6.1 (la versión más nueva en este momento) y en realidad encontré lo siguiente:

Si configuro la cookie mediante Javascript usando document.cookie = … entonces no funciona. Sin embargo, si envío una función setCookie a través de Ajax al servidor con una función como

 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=/"; } } 

y establecer la cookie en el lado del servidor usando

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

¡entonces realmente funciona!

Espero que esto ayude. Aclamaciones

Tuve el mismo problema, y ​​decidí moverme evrth al localStorage escribí el complemento para que pueda usarlo también: angular-cookies-mirror

por supuesto que puede.

aplicación iónica solo envíe un ajax requset, la cookie funciona bien o no depende del servidor.

tengo trabajo con el servidor python Django y el servidor de nodos, ambas cookies funcionaron muy bien

código de nodo a continuación

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

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

código de aplicación iónica

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

puedes consultar mi código de sourse aquí