Manejo de cookies en PhoneGap/Cordova
xmlhttprequest (7)
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 pitón / 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 (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);
});
}
A continuación, puede llamar a esto de la siguiente manera:
persistToken(
someToken,
function() {
console.log("token persisted");
},
function() {
console.log("something went wrong);
}
);
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
}
}
}
});
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
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.
Tuve el mismo problema, y decidí moverme evrth al localStorage escribí el complemento para que pueda usarlo también: angular-cookies-mirror
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.
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)
});
}