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

Я работаю над приложением PhoneGap с использованием сеанса на сервере. Для обработки сессии нужны куки. Кроме того, 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. Куки-файлы обходят эту проблему, используя флаг httponly.
  • iOS: есть некоторые модификации, которые изменят поведение webView для поддержки файлов cookie. Но, похоже, они не работают с iOS 6 и PhoneGap 2.5: https: //groups.google.com/forum/?fromgroups=#!topic/phonegap/ZJE1nxX63ow
  • Файлы cookie включены по умолчанию в AppDelegate.m (v2.5).
81 голос | спросил Bernd 12 MaramTue, 12 Mar 2013 01:41:51 +04002013-03-12T01:41:51+04:0001 2013, 01:41:51

7 ответов


0

Друг, я тоже безуспешно пытался использовать куки с телефонной пробкой. Решение было использовать 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 /ен /6.x /Cordova /хранение /storage.html # страница-TOC-источник

Помните: использование анонимной навигации в 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
            }
        }
    }
});
ответил Tiago Gouvêa 15 Maypm13 2013, 16:23:42
0

Вы также можете добавить идентификатор сеанса к запрашивающему URL и, в зависимости от языка серверного приложения, получить данные сеанса, используя переданное вами значение идентификатора сеанса строки запроса. Например, в PHP вы можете открыть существующий сеанс, передав идентификатор сеанса. , Хотя это не рекомендуется из-за риска перехвата сеанса, вы можете легко проверить IP-адрес и браузер, чтобы убедиться, что сеанс идет от одного и того же клиента. Это, конечно, потребует от вас истечения сеанса, как только клиент закроет браузер сеанса, и ограничит вас от кэширования представлений, так как сеанс будет включен в фактический HTML. Хранение данных на локальном устройстве для меня, по крайней мере, на самом деле не вариант, так как для клиента это слишком много, что, на мой взгляд, представляет гораздо большую угрозу безопасности.

ответил moderncode 6 J0000006Europe/Moscow 2013, 15:28:14
0

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

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

  • Файлы cookie, установленные с помощью AJAX (например, jQuery $.get() или $.post()) не сохраняются
  • Файлы cookie, установленные в inAppBrowser, do сохраняются.

Таким образом, чтобы сохранить 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);
   }
);
ответил Mike N 7 MonEurope/Moscow2015-12-07T13:53:54+03:00Europe/Moscow12bEurope/MoscowMon, 07 Dec 2015 13:53:54 +0300 2015, 13:53:54
0

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

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

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

ответил Abdullah Al-Salloum 24 PM00000080000003831 2014, 20:55:38
0

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

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

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

ответил S. F. 31 MarpmThu, 31 Mar 2016 16:26:59 +03002016-03-31T16:26:59+03:0004 2016, 16:26:59
0

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

ответил uamanager 8 Jam1000000amSun, 08 Jan 2017 05:05:04 +030017 2017, 05:05:04
0

Конечно можно.

Ионные приложения просто отправляют реквизиты 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)
  });
}

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

ответил wangjinyang 24 AM000000100000002531 2017, 10:52:25

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132