2013-03-11 21 views
74

Pracuję nad aplikacją PhoneGap z użyciem sesji serwera. Do obsługi sesji potrzebuje plików cookie. Dodatkowo plik cookie z modułu równoważenia obciążenia również powinien być obsługiwany. Więc nie ma sposobu. W jaki sposób obchodzić się z plikami cookie w aplikacji PhoneGap?Obsługa ciasteczek w PhoneGap/Cordova

już dokonane rozeznanie:

  • Niektórzy mówią obsługę plików cookie może zależeć na serwer nie ustawianie ciasteczek nieznanych agentów użytkownika (IIS): PhoneGap session (cookies) on iOS
  • W ciasteczek JavaScript może być ustawiony z dokumentu. cookie = ..., ale nie są zapisywane w PhoneGap i utracone. Przed uruchomieniem xhr wniosków działa.
  • Pliki cookie można pobrać po wysłaniu żądania xhr za pomocą xhr.getResponseHeader ('Set-Cookie'). Ale tylko wtedy, gdy jest ustawiony na serwerze. Niestety, jQuery usuwa nagłówek "Cookie".
  • Właściwość JavaScript document.cookie nie jest przypisywana i nie jest aktualizowana po żądaniach (xhr).
  • Niektórzy sugerują, że localStorage zapisuje identyfikatory sesji itp. Jednak wszystkie skrypty mogą uzyskać do niego dostęp, co może być problemem bezpieczeństwa XSS. Pliki cookie rozwiązują ten problem za pomocą flagi httponly.
  • iOS: Istnieje kilka modyfikacji, które zmienią zachowanie webView w celu obsługi plików cookie. Wydaje się jednak, że nie działają one z iOS 6 i PhoneGap 2.5: https://groups.google.com/forum/?fromgroups=#!topic/phonegap/ZJE1nxX63ow
  • Pliki cookie wydają się domyślnie włączone w AppDelegate.m (v2.5).
+0

Co masz na myśli, że wszystkie skrypty mogą uzyskać dostęp do localStorage? Myślałem, że to oddzielne i rodzaj piaskownicy dla każdej aplikacji PhoneGap ... nie? – jayarjo

+0

Tutaj: http://stackoverflow.com/questions/15184567/is-local-storage-for-a-phonegap-app-on-an-android-device-separate-from-the-builded – jayarjo

+0

Może ta wtyczka pomaga? https://github.com/assembly/cordova-cookie-jar –

Odpowiedz

62

Przyjaciel, próbowałem też bez powodzenia używać plików cookie z phonegap. Rozwiązaniem było użycie localStorage.

Key Krótki przykład:

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

Set Item Krótki przykład:

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

Get Element Szybkie Przykład

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

usuń Krótki przykład:

window.localStorage.removeItem("key"); 

Wyczyść Krótki przykład:

window.localStorage.clear(); 

Jeśli używasz Ci javascript zarówno dla mobilnych i internetowych, można użyć tego kodu, aby wykryć, że otoczenie:

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

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

Pamiętaj: korzystanie z anonimowej nawigacji w systemie iOS może sprawić, że usługa localstorage nie będzie działać tak, jak spodziewana. Prosty test, który pracuje w porządku do mnie:

$(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, Jeśli chodzi o twoją odpowiedź, czy mógłbyś wyjaśnić, czy opcja localStorage nie zniknie, dopóki nie zostanie odinstalowana aplikacja? a także czy możemy powiedzieć, że z pewnością inne aplikacje nie mogą osiągnąć pary klucz-wartość, które ustawiam w mojej aplikacji? – shamaleyte

+2

@shamaleyte "LocalStorage działa bardziej jak pamięć podręczna, a nie pliki cookie, gdzie trwałość każdej z nich zależy od ustawień przeglądarki użytkownika i sposobu, w jaki sama przeglądarka ją implementuje (ponieważ nie ma w niej specyfikacji)" http://stackoverflow.com/ pytania/9948284/how-persistent-is-localstorage –

+0

Proszę NIE używać localstorage w Cordova! w systemie iOS proces systemowy może dowolnie opróżniać magazyn lokalny. https://gonehybrid.com/dont-assume-localstorage-will-always-work-in-your-hybrid-app/ –

3

Można również dołączyć identyfikator sesji do adresu URL wzywającego oraz w zależności od języka Application Server, pobrać dane sesji przy użyciu ciągu kwerendy wartość identyfikatora sesji, minęło - przykład w PHP można otworzyć istniejącą sesję, przekazując identyfikator sesji.Chociaż nie jest to zalecane ze względu na ryzyko przechwycenia sesji, możesz łatwo przetestować adres IP i przeglądarkę, aby upewnić się, że sesja pochodzi od tego samego klienta. To oczywiście wymagałoby wygaśnięcia sesji, gdy tylko klient zamknie przeglądarkę sesji i ograniczyłoby liczbę buforowanych widoków, ponieważ sesja byłaby zawarta w rzeczywistym html. Przechowywanie danych na urządzeniu lokalnym przynajmniej dla mnie nie jest tak naprawdę opcją, ponieważ wystawia za dużo klientowi, co moim zdaniem stanowi o wiele większe zagrożenie dla bezpieczeństwa.

+0

Możesz również wysłać go przez wpis XmtHttpRequest, np. używając '$ .post()' in jQuery, a następnie ustaw zmienną lokalną. Jeśli zaszyfrujesz wszystko, to jest całkiem bezpieczne. – JVE999

+0

@ JVE999 jak zaszyfrować pliki cookie, które domyślnie są zapisywane w widoku WWW? – LoveForDroid

2

Użyj adresu device_id, aby adresować określone rekordy po stronie serwera. Utwórz tabelę bazy danych o nazwie session na serwerze z device_id, cookiename, cookievalue i timestamp jako kolumny.

Gdy klient uzyskuje dostęp do serwera WWW za pośrednictwem aplikacji phonegap, pobierz jego device_id i zapisz pliki cookie w tabeli. device_id here działa jako token dostępu w protokole OAuth.

Teraz ze względów bezpieczeństwa należy skrócić okres ważności tych rekordów, ponieważ identyfikator urządzenia jest stały, a klient zechce sprzedać swoje telefony w jeden dzień. Dlatego użyj timestamp, aby zapisać ostatni dostęp klienta i usuń rekord, jeśli nie był dostępny przez, powiedzmy 10 dni.

3

Podobnie jak Państwo chciałem użyć plików cookie ustawionych przez serwer w mojej aplikacji, aby moja aplikacja była zgodna z siecią i nie wymagała oddzielnego identyfikatora urządzenia lub innej metody uwierzytelniania.

Co odkryto, następujące:

  • cookies utworzone przez AJAX (np jQuery $.get() lub $.post()) nie utrzymują
  • cookies utworzone w 'inAppBrowser' do utrzymywać.

Sposobem na utrwalenie pliku cookie jest użycie wtyczki inAppBrowser.

Najpierw skonfiguruj prosty serwer, który będzie akceptowany jako parametry klucz-wartość parametru GET, który chcesz zachować. Jestem python/tornado facet, więc mój serwer może wyglądać następująco:

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

Następnie w aplikacji:

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

Można połączyć to w następujący sposób:

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

Używam Cordova 6.1 (najnowsza wersja w tej chwili) i faktycznie znalazłem następujące:

Jeśli ustawiam ciasteczko przez JavaScript za pomocą dokumentu ment.cookie = ... to nie działa. Jednak jeśli mogę wysłać SetCookie funkcji poprzez Ajax na serwerze z funkcją jak

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

i ustawić ciasteczko po stronie serwera za pomocą

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

to ma faktycznie działa!

Mam nadzieję, że to pomoże. Cheers

0

miał ten sam problem, i postanowił przenieść evrth do localStorage napisałem plugin, dzięki czemu można go używać również: angular-cookies-mirror

0

oczywiście można.

jonowa aplikacja po prostu wyślij prośbę o ajax, pliki cookie działają dobrze lub nie zależą od serwera.

mam pracę z Pythona serwera Django i serwerem węzła, zarówno Cookie pracował bardzo dobrze

kod węzeł poniżej

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

API REST

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

jonowy kod aplikacji

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

you can check my sourse code here