Обработка файлов 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

Друг, я тоже безуспешно пытался использовать куки-файлы при телефонной связи. Решение было использовать 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 может привести к тому, что localstorage не будет работать как указано. Простой тест, который мне подходит:

$(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
Тиаго, Что касается вашего ответа, не могли бы вы уточнить, сохраняется ли опция localStorage (без потери данных) до тех пор, пока приложение не будет удалено? а также можем ли мы сказать, что другие приложения точно не могут достичь пары ключ-значение, которую я установил в своем приложении?
шамалейте
2
@shamaleyte «LocalStorage действует больше как кеш, чем файлы cookie, где постоянство каждого из них зависит от настроек браузера пользователя и того, как сам браузер реализует его (поскольку для него нет спецификаций)» stackoverflow.com/questions/9948284/…
Tiago Gouvêa
Пожалуйста, НЕ используйте местное хранилище в Кордове! в iOS системный процесс может очищать локальное хранилище по желанию. GoHybrid.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. Хранение данных на локальном устройстве для меня, по крайней мере, не вариант, так как это слишком много открывает для клиента, что, на мой взгляд, представляет собой гораздо больший риск для безопасности.

современный код
источник
Вы также можете отправить его через сообщение XmtHttpRequest, например, используя $.post()в jQuery, а затем установить локальную переменную. Если вы зашифруете все, это довольно безопасно.
JVE999
@ JVE999 как зашифровать файлы cookie, которые по умолчанию сохраняются в веб-просмотре?
LoveForDroid
3

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

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

Теперь по соображениям безопасности вам необходимо сократить срок действия этих записей, потому что device_id является постоянным, и ваш клиент захочет продать свои телефоны в один прекрасный день. Поэтому используйте 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 , "/" );

тогда это действительно работает!

Надеюсь это поможет. Ура

SF
источник
0

У меня была та же проблема, и я решил переместить evrth в localStorage, я написал плагин, чтобы вы также могли его использовать: angular-cookies-mirror

Uamanager
источник
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.

Мо
источник