Manipulando cookies no PhoneGap / Cordova

Eu estou trabalhando em um aplicativo PhoneGap com o uso da session do servidor. Precisa de cookies para lidar com a session. Além disso, o cookie do balanceador de carga também deve ser tratado. Então não há como fugir. Como você lida com os cookies no seu aplicativo PhoneGap?

Eu já realizei algumas pesquisas:

  • Alguns dizem que o tratamento de cookies pode depender do servidor não configurar cookies para agentes de usuários desconhecidos (IIS): session PhoneGap (cookies) no iOS
  • Em JavaScript cookies podem ser definidos com document.cookie = …, mas eles não são salvos no PhoneGap e perdidos. Antes de triggersr pedidos xhr ele funciona.
  • Os cookies podem ser recuperados após a solicitação xhr com xhr.getResponseHeader (‘Set-Cookie’). Mas somente quando realmente definido no servidor. Infelizmente, o jQuery retira o header “Cookie”.
  • A propriedade JavaScript document.cookie não é atribuída e não é atualizada após solicitações (xhr).
  • Alguns sugerem o localStorage para salvar ids de session, etc. Mas todos os scripts podem acessá-lo e isso pode ser um problema de segurança do XSS. Os cookies resolvem esse problema usando o sinalizador httponly.
  • iOS: existem algumas modificações que alterarão o comportamento do webView para oferecer suporte a cookies. Mas eles parecem não funcionar com o iOS 6 e o ​​PhoneGap 2.5: https://groups.google.com/forum/?fromgroups=#!topic/phonegap/ZJE1nxX63ow
  • Os cookies parecem estar ativados por padrão no AppDelegate.m (v2.5).

Amigo, também tentei sem sucesso usar cookies com phonegap. A solução foi usar o localStorage.

Exemplo rápido chave:

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

Exemplo Rápido de Item de Definição:

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

Obter um exemplo rápido de item

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

Exemplo de remoção de item rápido:

  window.localStorage.removeItem("key"); 

Exemplo rápido e claro:

  window.localStorage.clear(); 

Se você usa o javascript tanto para dispositivos móveis quanto para a Web, pode usar esse código para detectar esse ambiente:

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

Referências: 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-to-source

Esteja ciente: o uso da navegação anônima no iOS pode fazer com que o localstorage não funcione como o spect. Um teste simples que está funcionando bem para mim:

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

Você também pode append o id da session ao url solicitante e, dependendo do idioma do aplicativo do servidor, buscar dados da session usando o valor de id da session da cadeia de consulta passado – exemplo em PHP, você pode abrir uma session existente passando o id da session. Embora isso não seja recomendado devido a riscos de seqüestro de session, você pode testar facilmente o IP e o Navegador para garantir que a session seja proveniente do mesmo cliente. Isso, é claro, exigiria que você expirasse sua session assim que o cliente fechasse o navegador da session e o limitaria das exibições em cache, já que a session seria incluída no html real. Armazenar dados no dispositivo local, pelo menos para mim, não é realmente uma opção, pois expõe demais ao cliente, o que, na minha opinião, representa um risco de segurança muito maior.

Semelhante a você, eu queria usar os cookies definidos por um servidor em meu aplicativo para que meu aplicativo fosse consistente com a Web e não exigisse um ID de dispositivo separado ou outro método de autenticação.

O que descobri é o seguinte:

  • Cookies definidos via AJAX (por exemplo, jQuery $.get() ou $.post() ) não persistem
  • Os cookies definidos em um ‘inAppBrowser’ persistem.

A maneira de obter um cookie para persistir é usar o plugin inAppBrowser .

Primeiro, configure um servidor simples que aceite como parâmetros de valor-chave do parâmetro GET que você deseja persistir. Eu sou um cara de python / tornado, então meu servidor pode se parecer com:

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

Então, no seu aplicativo:

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

Você pode então chamar isto da seguinte maneira:

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

Use o device_id para endereçar certos registros no lado do servidor. Crie uma tabela de database chamada session no seu servidor com device_id , cookiename , cookievalue e timestamp como colunas.

Quando um cliente acessa seu servidor web via aplicativo phonegap, obtenha seu device_id e armazene os cookies em sua tabela. O device_id here age como o token de access no protocolo OAuth.

Agora, por motivos de segurança, você precisa reduzir o período de validade desses registros, porque o device_id é permanente e seu cliente gostaria de vender seus telefones um dia. Portanto, use o timestamp de timestamp e timestamp para armazenar o último access pelo cliente e exclua o registro se ele não tiver sido acessado por, digamos, 10 dias.

Eu estou usando o Cordova 6.1 (versão mais recente no momento) e realmente encontrei o seguinte:

Se eu definir o cookie via Javascript usando document.cookie = … então não funciona. No entanto, se eu enviar uma function setCookie via Ajax para o servidor com uma function 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=/"; } } 

e definir o cookie no lado do servidor usando

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

então realmente funciona!

Espero que isto ajude. Felicidades

Tive o mesmo problema, e decidi mover o evrth para o localStorage eu escrevi o plugin para que você possa usá-lo também: angular-cookies-mirror

claro que você pode.

aplicativo iônico basta enviar um ajax requset, cookie funciona bem ou não depende do servidor.

Eu tenho trabalho com o servidor python Django e servidor de nó, ambos funcionaram muito bem

código do nó abaixo

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

descanso 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 aplicativo iônico

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

você pode verificar meu código sourse aqui