Обробка файлів cookie в PhoneGap / Cordova


88

Я працюю над додатком PhoneGap із використанням сеансу сервера. Для обробки сеансу потрібні файли cookie. Крім того, слід обробляти і файли cookie з балансувача навантаження. Отож шляху тут немає. Як ви обробляєте файли cookie у своєму додатку PhoneGap?

Я вже здійснив деякі дослідження:

  • Деякі кажуть, що обробка файлів cookie може залежати від того, що сервер не встановив файли cookie для невідомих агентів користувача (IIS): сеанс PhoneGap (файли cookie) на iOS
  • У JavaScript файли cookie можна встановити за допомогою document.cookie = ..., але вони не зберігаються у PhoneGap і втрачаються. Перш ніж запускати запити xhr, це працює.
  • Файли cookie можна отримати після запиту xhr за допомогою xhr.getResponseHeader ('Set-Cookie'). Але лише тоді, коли це фактично встановлено на сервері. На жаль, jQuery видаляє заголовок "Cookie".
  • Властивість JavaScript document.cookie не призначається і не оновлюється після запитів (xhr).
  • Деякі пропонують localStorage зберігати ідентифікатори сесій тощо. Але всі скрипти можуть отримати до нього доступ, і це може бути проблемою безпеки XSS. Файли cookie вирішують цю проблему за допомогою позначки httponly.
  • iOS: Є деякі модифікації, які змінять поведінку webView для підтримки файлів cookie. Але вони, схоже, не працюють з iOS 6 і PhoneGap 2.5: https://groups.google.com/forum/?fromgroups=#!topic/phonegap/ZJE1nxX63ow
  • Здається, файли cookie за замовчуванням увімкнені в AppDelegate.m (v2.5).

Що ви маєте на увазі, що всі сценарії можуть отримати доступ до localStorage? Я думав, що це окремо і в певній мірі для кожного додатку PhoneGap ... ні?
jayarjo


Можливо, цей плагін допомагає? github.com/assembly/cordova-cookie-jar
J Chris A

Відповіді:


68

Друже, я теж безуспішно намагався використовувати файли cookie з фонегапом. Рішенням було використання localStorage.

Ключовий швидкий приклад:

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

Швидкий приклад встановлення елемента:

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

Отримати швидкий приклад товару

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

Швидкий приклад вилучення елемента:

 window.localStorage.removeItem("key");

Ясний швидкий приклад:

 window.localStorage.clear();

Якщо ви використовуєте javascript як для мобільних пристроїв, так і для Інтернету, ви можете використовувати цей код для виявлення цього середовища:

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

Посилання: 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

Майте на увазі: використання анонімної навігації на iOS може призвести до того, що локальне зберігання не працюватиме так, як передбачається. Простий тест, який мені добре підходить:

$(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, Щодо вашої відповіді, чи не могли б Ви пояснити, чи зберігається параметр localStorage (втрата даних не відбувається), доки додаток не буде видалено? а також, чи можна сказати, що це точно, що інші програми не можуть досягти пари ключ-значення, яку я встановив у своїй програмі?
shamaleyte

2
@shamaleyte "LocalStorage діє швидше як кеш, а не файли cookie, де стійкість кожного залежить від налаштувань браузера користувача та від того, як сам браузер його реалізує (оскільки для нього відсутні специфікації)" stackoverflow.com/questions/9948284/…
Tiago Gouvêa,

Будь ласка, НЕ використовуйте місцеве сховище в Кордові! в iOS системний процес може змивати локальне сховище за бажанням. gonehybrid.com/…
Ніко Вестердейл

4

Подібно до вас, я хотів використовувати файли cookie, встановлені сервером у моїй програмі, щоб моя програма відповідала Інтернету та не вимагала окремого ідентифікатора пристрою або іншого методу автентифікації.

Я виявив наступне:

  • Файли cookie, встановлені через AJAX (наприклад, jQuery $.get()або $.post()), не зберігаються
  • Файли cookie, встановлені в "inAppBrowser" , зберігаються.

Шлях до того, щоб зберегти cookie, - це використовувати плагін inAppBrowser .

По-перше, налаштуйте простий сервер, який приймає як параметр GET параметри ключ-значення, які ви хочете зберегти. Я хлопець із пітона / торнадо, тому мій сервер може виглядати так:

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

Потім у вашому додатку:

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

Потім ви можете викликати це наступним чином:

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

3

Ви також можете додати ідентифікатор сеансу до запитуючої URL-адреси, і залежно від мови серверної програми отримуйте дані сеансу за допомогою переданого вами значення ідентифікатора рядка запиту - наприклад, у PHP ви можете відкрити існуючий сеанс, передавши ідентифікатор сесії. Хоча це не рекомендується через ризик викрадення сесії, ви можете легко перевірити IP та браузер, щоб переконатися, що сеанс надходить від того самого клієнта. Це, звичайно, вимагатиме закінчення терміну вашої сесії, як тільки клієнт закриє браузер сеансу, і обмежило б вам можливості кешування подань, оскільки сеанс буде включений до фактичного html. Зберігання даних на локальному пристрої для мене, принаймні, насправді не є варіантом, оскільки це занадто багато піддає клієнту, що, на мій погляд, набагато більший ризик для безпеки.


Ви також можете надіслати його через post XmtHttpRequest, наприклад, за допомогою $.post()jQuery, а потім встановити локальну змінну. Якщо ви все зашифруєте, це досить безпечно.
JVE999,

@ JVE999 як зашифрувати файли cookie, які зберігаються за замовчуванням у веб-перегляді?
LoveForDroid

3

Використовуйте device_idдля адресування певних записів на стороні сервера. Створення таблиці бази даних з ім'ям sessionна сервері з device_id, cookiename, cookievalueі в timestampякості стовпців.

Коли клієнт отримує доступ до вашого веб-сервера через додаток phonegap, отримайте його device_idта збережіть файли cookie у вашій таблиці. device_id hereВиступає в якості маркера доступу по протоколу OAuth.

Тепер з міркувань безпеки вам потрібно скоротити термін дії цих записів, оскільки ідентифікатор пристрою постійний, і ваш клієнт захоче продати свої телефони одного дня. Тому використовуйте timestampдля зберігання останнього доступу клієнта та видаліть запис, якщо він не був доступний, скажімо, 10 днів.


3

Я використовую Cordova 6.1 (найновіша версія на даний момент), і насправді я виявив наступне:

Якщо я встановив файл cookie через Javascript, використовуючи document.cookie = ..., тоді він не працює. Однак, якщо я надсилаю функцію setCookie через Ajax на сервер із функцією типу

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

і встановіть файл cookie на стороні сервера за допомогою

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

тоді це насправді працює!

Сподіваюся, це допомагає. Ура


0

У мене була та ж проблема, і я вирішив перенести evrth до localStorage, я написав плагін, щоб ви могли ним також користуватися: angular-cookies-mirror


0

звичайно, ви можете.

ionic додаток просто надсилає запит ajax, файли cookie працюють належним чином або не залежать від сервера.

я працюю з сервером python Django та сервером вузлів, обидва файли cookie працювали дуже добре

код вузла нижче

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 відпочинку

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

іонний код програми

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

Ви можете перевірити мій вихідний код тут


0

Я думаю, що питання принципово стосується встановлення файлів cookie на стороні клієнта для програми cordova. Більшість інформації на цю тему передбачає, що встановлення файлів cookie на стороні клієнта не працює для Cordova.

Але я знайшов плагін, який дозволяє мені встановлювати файли cookie на стороні клієнта для мого додатку cordova.

Перевірте https://www.npmjs.com/package/cordova-plugin-cartegraph-cookie-master .

Це просто працює!


0

У мене також виникали проблеми із файлами cookie сеансу із запитами Cordova + XHR. Файли cookie втрачаються при кожному перезавантаженні програми. Мої проблеми вирішили дві речі:

  1. Файли cookie повинні мати термін придатності.

  2. Для всіх запитів XHR має бути встановлено прапорець withCredentials на true.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.