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

Я работаю над приложением PhoneGap с использованием сеанса сервера. Для обработки сеанса необходимы файлы cookie. Кроме того, необходимо обработать файл cookie с балансировщика нагрузки. Так что вокруг нет пути. Как вы обрабатываете Cookies в приложении PhoneGap?

Я уже провел некоторое исследование:

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

Ответ 1

Друг, я тоже безуспешно пытался использовать файлы 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 может привести к тому, что 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
            }
        }
    }
});

Ответ 2

Подобно вам, я хотел использовать файлы cookie, установленные сервером в моем приложении, чтобы мое приложение соответствовало веб-интерфейсу и не требовало отдельного идентификатора устройства или другого метода аутентификации.

Я обнаружил следующее:

  • Cookies, установленные через AJAX (например, jQuery $.get() или $.post()), не сохраняются
  • Cookies, установленные в 'inAppBrowser' do, сохраняются.

Таким образом, для сохранения cookie файла необходимо использовать плагин inAppBrowser.

Сначала настройте простой сервер, который принимает параметры параметра ключа GET, которые вы хотите сохранить. Я парень python/tornado, поэтому мой сервер может выглядеть так:

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

Ответ 4

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

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

Теперь по соображениям безопасности вам нужно уменьшить срок действия этих записей, потому что device_id permenant и ваш клиент захочет продать свои телефоны в один прекрасный день. Поэтому используйте timestamp для хранения последнего доступа клиентом и удалите запись, если к ней не было доступа, например 10 дней.

Ответ 5

Я использую 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 , "/" );

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

Надеюсь, это поможет. Приветствия

Ответ 6

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

Ответ 7

конечно, вы можете.

ионное приложение просто отправляет ajax requset, cookie работает хорошо или не зависит от сервера.

У меня есть работа с сервером Django python и сервером node, оба файла cookie очень хорошо работают

node код ниже

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

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

вы можете проверить здесь код моего источника

Ответ 8

Я думаю, что вопрос заключается в настройке файлов cookie на стороне клиента для приложения Cordova. Большая часть информации по этой теме подразумевает, что настройка cookie на стороне клиента не работает для cordova.

Но я нашел плагин, который позволяет мне устанавливать клиентские куки для моего приложения Cordova.

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

Это просто работает!

Ответ 9

У меня также были проблемы с файлом cookie сеанса с запросами Cordova + XHR. Файлы cookie теряются при каждом перезапуске приложения. Две вещи решили мои проблемы:

  1. Куки должны иметь срок годности.

  2. Все запросы XHR должны иметь флаг withCredentials, установленный в значение true.