PhoneGap / Cordova'da çerezleri kullanma


89

Sunucu oturumu kullanımına sahip bir PhoneGap uygulaması üzerinde çalışıyorum. Oturumu idare etmek için çerezlere ihtiyaç duyar. Ek olarak, yük dengeleyiciden gelen çerez de işlenmelidir. Yani etrafta yol yok. PhoneGap uygulamanızda Çerezleri nasıl ele alıyorsunuz?

Zaten bazı araştırmalar yaptım:

  • Bazıları çerez işlemenin sunucunun bilinmeyen kullanıcı aracıları (IIS) için çerez ayarlamamasına bağlı olabileceğini söylüyor: iOS'ta PhoneGap oturumu (çerezler)
  • JavaScript'te tanımlama bilgileri document.cookie = ... ile ayarlanabilir, ancak PhoneGap'e kaydedilmez ve kaybolmaz. Xhr isteklerini ateşlemeden önce çalışır.
  • Çerezler, xhr.getResponseHeader ('Set-Cookie') ile xhr talebinden sonra alınabilir. Ancak yalnızca sunucuda gerçekten ayarlandığında. Maalesef jQuery, "Cookie" başlığını çıkarır.
  • JavaScript document.cookie özelliği atanmaz ve (xhr) isteklerinden sonra güncellenmez.
  • Bazıları localStorage'ın oturum kimliklerini vb. Kaydetmesini önerir. Ancak tüm komut dosyaları ona erişebilir ve bu XSS güvenlik sorunu olabilir. Çerezler, HTPONLY bayrağını kullanarak bu sorunu çözer.
  • iOS: Çerezleri desteklemek için webView davranışını değiştirecek bazı değişiklikler var. Ancak iOS 6 ve PhoneGap 2.5 ile çalışmıyor gibi görünüyorlar: https://groups.google.com/forum/?fromgroups=#!topic/phonegap/ZJE1nxX63ow
  • Çerezler, AppDelegate.m'de (v2.5) varsayılan olarak etkin görünüyor.

Tüm betiklerin localStorage'a erişebileceğini kastediyorsunuz? Her PhoneGap uygulaması için ayrı ve korumalı olduğunu düşündüm ... hayır?
jayarjo


Belki bu eklenti yardımcı olur? github.com/assembly/cordova-cookie-jar
J Chris A

Yanıtlar:


68

Arkadaşım, ben de telefon aralıklı çerezleri kullanmayı başaramadım. Çözüm localStorage kullanmaktı.

Anahtar Hızlı Örnek:

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

Set Öğesi Hızlı Örneği:

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

Öğeye Hızlı Örnek Alın

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

Öğeyi Kaldır Hızlı Örnek:

 window.localStorage.removeItem("key");

Hızlı Örneği Temizle:

 window.localStorage.clear();

Javascript'i hem mobil hem de web için kullanıyorsanız, bu kodu bu ortamı tespit etmek için kullanabilirsiniz:

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

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

Unutmayın: iOS'ta anonim gezinme kullanmak, yerel depolamanın görüldüğü gibi çalışmamasına neden olabilir. Benim için iyi çalışan basit bir test:

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

1
Tiago, Cevabınızla ilgili olarak, uygulama kaldırılıncaya kadar localStorage seçeneğinin devam edip etmediğini (veri kaybı olmaz) açıklar mısınız? ve ayrıca, diğer uygulamaların uygulamamda belirlediğim bir anahtar / değer çiftine ulaşamayacağından emin olabilir miyiz?
shamaleyte

2
@shamaleyte "LocalStorage, çerezlerden ziyade önbellek gibi davranır, burada her birinin kalıcılığı kullanıcının tarayıcı ayarlarına ve tarayıcının kendisini nasıl uyguladığına bağlıdır (bunun için herhangi bir özellik olmadığından)" stackoverflow.com/questions/9948284/…
Tiago Gouvêa

Lütfen Cordova'da yerel depolama KULLANMAYIN! iOS'ta sistem işlemi yerel depolamayı isteğe göre temizleyebilir. gonehybrid.com/…
Nico Westerdale

4

Size benzer şekilde, uygulamamın web ile tutarlı olması ve kimlik doğrulaması için ayrı bir cihaz kimliği veya başka bir yöntem gerektirmemesi için uygulamam içinde bir sunucu tarafından ayarlanan çerezleri kullanmak istedim.

Keşfettiğim şey şudur:

  • AJAX aracılığıyla ayarlanan çerezler (örneğin jQuery $.get()veya $.post()) kalıcı değildir
  • Bir 'inAppBrowser' ayarlanan Çerezler do inat.

Böylece bir çerezin kalıcı olmasını sağlamanın yolu, inAppBrowser eklentisini kullanmaktır .

İlk olarak, kalıcı olmasını istediğiniz GET parametresi anahtar-değer parametrelerini kabul eden basit bir sunucu kurun. Ben bir python / tornado adamıyım, bu yüzden sunucum şöyle görünebilir:

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

Ardından uygulamanızda:

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

Daha sonra bunu şu şekilde arayabilirsiniz:

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

3

Ayrıca, oturum kimliğini talep eden url'ye ekleyebilir ve sunucu uygulama diline bağlı olarak, geçirdiğiniz sorgu dizesi oturum kimliği değerini kullanarak oturum verilerini alabilirsiniz - örneğin PHP'de oturum kimliğini ileterek mevcut bir oturumu açabilirsiniz. Oturum ele geçirme riskleri nedeniyle bu önerilmez, ancak oturumun aynı istemciden geldiğinden emin olmak için IP ve Tarayıcıyı kolayca test edebilirsiniz. Bu, elbette, istemci oturum tarayıcısını kapatır kapatmaz oturumunuzu sona erdirmenizi gerektirir ve oturum gerçek html'ye dahil edileceğinden, sizi önbellek görünümlerinden sınırlandırır. Verileri yerel cihazda saklamak en azından benim için gerçekten bir seçenek değil, çünkü müşteriye çok fazla maruz kalıyor ki bu da bence çok daha büyük bir güvenlik riski.


Ayrıca jQuery'de kullanmak gibi bir XmtHttpRequest postası yoluyla da gönderebilir $.post(), ardından yerel bir değişken ayarlayabilirsiniz. Her şeyi şifrelerseniz, bu oldukça güvenlidir.
JVE999

@ JVE999 web görünümü ile varsayılan olarak kaydedilen tanımlama bilgileri nasıl şifrelenir?
LoveForDroid

3

device_idSunucu tarafındaki belirli kayıtları ele almak için kullanın . Adlı bir veritabanı tablosu oluşturma sessionile sunucuda device_id, cookiename, cookievalueve timestampsütunlar gibi.

Bir müşteri web sunucunuza phonegap uygulaması aracılığıyla eriştiğinde device_id, çerezleri alın ve tablonuzda saklayın. device_id hereOAuth protokolünde sembolünüzü olarak hareket eder.

Şimdi güvenlik nedenleriyle bu kayıtların geçerlilik süresini kısaltmanız gerekir, çünkü device_id kalıcıdır ve müşteriniz telefonlarını bir gün satmak isteyecektir. Bu nedenle, timestampistemcinin son erişimini saklamak için kullanın ve örneğin 10 gün boyunca erişilmemişse kaydı silin.


3

Cordova 6.1 (şu anki en yeni sürüm) kullanıyorum ve aslında aşağıdakileri buldum:

Çerezi Javascript aracılığıyla document.cookie = ... kullanarak ayarlarsam çalışmaz. Ancak, Ajax aracılığıyla setCookie işlevini sunucuya şöyle bir işlevle gönderirsem

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

ve çerezi sunucu tarafında ayarlayın

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

o zaman gerçekten işe yarıyor!

Bu yardımcı olur umarım. Şerefe



0

tabi ki yapabilirsin.

İyonik uygulama sadece bir ajax requset gönderir, çerez iyi çalışır veya sunucuya bağlı değildir.

python Django sunucusu ve düğüm sunucusu ile çalıştım, her ikisi de çerez çok iyi çalıştı

aşağıdaki düğüm kodu

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

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

iyonik uygulama kodu

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

kaynak kodumu buradan kontrol edebilirsiniz


0

Bence asıl soru, bir cordova uygulaması için istemci tarafı çerezleri ayarlamakla ilgili. Bu konudaki çoğu bilgi, istemci tarafı tanımlama bilgilerinin ayarlanmasının cordova için çalışmadığını ima eder.

Ancak, cordova uygulamam için istemci tarafı çerezleri ayarlamama izin veren bir eklenti buldum.

Https://www.npmjs.com/package/cordova-plugin-cartegraph-cookie-master'a göz atın .

Sadece çalışıyor!


0

Ayrıca Cordova + XHR istekleriyle ilgili oturum çerezi sorunları yaşadım. Çerezler, uygulama her yeniden başlatıldığında kaybolur. Sorunlarımı iki şey çözdü:

  1. Çerezlerin bir son kullanma tarihi olmalıdır.

  2. Tüm XHR isteklerinde withCredentials bayrağı true olarak ayarlanmış olmalıdır .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.