PhoneGap / कॉर्डोवा में कुकीज़ को संभालना


88

मैं सर्वर सत्र उपयोग के साथ PhoneGap ऐप पर काम कर रहा हूं। सत्र को संभालने के लिए इसे कुकीज़ की आवश्यकता होती है। इसके अतिरिक्त, लोड बैलेंसर से कुकी को भी संभाला जाना चाहिए। इसलिए कोई रास्ता नहीं है। आप अपने PhoneGap ऐप में कुकीज़ कैसे संभालते हैं?

मैंने पहले ही कुछ शोध पूरा कर लिया है:

  • कुछ लोग कहते हैं कि कुकी संभालना सर्वर पर निर्भर हो सकता है जो अज्ञात उपयोगकर्ता एजेंटों (IIS) के लिए कुकीज़ सेट नहीं कर रहा है: iOS पर PhoneGap सत्र (कुकीज़)
  • जावास्क्रिप्ट कुकीज़ में document.cookie = ... के साथ सेट किया जा सकता है, लेकिन वे PhoneGap में सहेजे नहीं जाते हैं और खो जाते हैं। फायरिंग अनुरोधों से पहले यह काम करता है।
  • कुकीज़ को xhr.getResponseHeader ('सेट-कुकी') के साथ xhr अनुरोध के बाद पुनर्प्राप्त किया जा सकता है। लेकिन केवल जब सर्वर पर वास्तव में सेट किया जाता है। दुर्भाग्य से, jQuery ने "कुकी" शीर्षक को छीन लिया।
  • JavaScript डॉक्यूमेंट.कॉकी प्रॉपर्टी को (xhr) अनुरोधों के बाद असाइन नहीं किया गया है और न ही अपडेट किया गया है।
  • कुछ लोग सत्र आईडी आदि को बचाने के लिए लोकलस्टोरेज का सुझाव देते हैं, लेकिन सभी स्क्रिप्ट इसे एक्सेस कर सकते हैं और यह XSS सुरक्षा समस्या हो सकती है। कुकीज़ httponly फ्लैग का उपयोग करके इस मुद्दे के आसपास काम करते हैं।
  • iOS: कुछ संशोधन हैं जो कुकीज़ का समर्थन करने के लिए webView व्यवहार को बदल देंगे। लेकिन वे iOS 6 और PhoneGap 2.5 के साथ काम नहीं कर रहे हैं: https://groups.google.com/forum/?fromgroups=# .topic/phonegap/ZJE1nxX63ow
  • AppDelegate.m (v2.5) में डिफ़ॉल्ट रूप से कुकीज़ सक्रिय होने लगती हैं।

क्या आप सभी लिपियों स्थानीय स्तर तक पहुँच सकते हैं? मैंने सोचा कि यह अलग और थोड़े सैंडबॉक्स था, जो हर फोनगैप ऐप के लिए है ... नहीं?
जयरोज़ो


शायद यह प्लगइन मदद करता है? github.com/assembly/cordova-cookie-jar
J Chris A

जवाबों:


68

मित्र, मैंने फोनगैप के साथ कुकीज़ का उपयोग करने के लिए सफलता के बिना भी प्रयास किया है। समाधान में लोकलस्टोरेज का उपयोग किया गया था।

मुख्य त्वरित उदाहरण:

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

यदि आप मोबाइल और वेब दोनों के लिए जावास्क्रिप्ट का उपयोग करते हैं, तो आप इस एनवायरमेंट का पता लगाने के लिए इस कोड का उपयोग कर सकते हैं:

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 # पेज-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
            }
        }
    }
});

1
टियागो, आपके जवाब के बारे में, क्या आप स्पष्ट कर सकते हैं कि ऐप के अनइंस्टॉल होने तक लोकलस्टोरेज विकल्प बरकरार रहता है (कोई डेटा लॉस नहीं होता है)? और यह भी, क्या हम यह कह सकते हैं कि यह सुनिश्चित करने के लिए है कि अन्य एप्लिकेशन एक महत्वपूर्ण-मूल्य जोड़ी तक नहीं पहुंच सकते हैं जिसे मैंने अपने ऐप में सेट किया है?
शामली

2
@shamaleyte "लोकलस्टोरीज कुकीज़ के बजाय कैश की तरह अधिक कार्य करता है, जहां प्रत्येक की दृढ़ता उपयोगकर्ता की ब्राउज़र सेटिंग्स पर निर्भर करती है, और कैसे ब्राउज़र खुद इसे लागू करता है (क्योंकि इसके लिए कोई चश्मा नहीं हैं)" stackoverflow.com/estestions/9948284/…
टिआगो गौवेआ

कृपया कॉर्डोवा में स्थानीय स्टोर का उपयोग न करें! आईओएस में सिस्टम प्रोसेस लोकलस्टोरेज को इच्छानुसार फ्लश कर सकता है। gohybrid.com/…
निको

4

आपके समान मैं अपने एप्लिकेशन के भीतर एक सर्वर द्वारा निर्धारित कुकीज़ का उपयोग करना चाहता था ताकि मेरा ऐप वेब के अनुरूप हो और प्रमाणीकरण के लिए अलग डिवाइस-आईडी या अन्य विधि की आवश्यकता न हो।

मैंने जो खोजा वह निम्नलिखित है:

  • AJAX के माध्यम से सेट कुकीज़ (जैसे jQuery $.get()या $.post()) जारी नहीं है
  • एक 'inAppBrowser' में सेट कुकीज़ करते लागू हैं।

इस प्रकार एक कुकी प्राप्त करने के लिए बने रहने का तरीका है InAppBrowser प्लगइन का उपयोग करना ।

सबसे पहले, एक साधारण सर्वर को सेटअप करें जो आपको प्राप्त करने के लिए जीईटी पैरामीटर कुंजी-मूल्य पैरामीटर के रूप में स्वीकार करता है। मैं एक अजगर / बवंडर आदमी हूं, इसलिए मेरा सर्वर जैसा दिख सकता है:

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 में आप सत्र आईडी में पास करके मौजूदा सत्र खोल सकते हैं। हालांकि यह सत्र अपहरण के जोखिमों के कारण अनुशंसित नहीं है, आप आसानी से आईपी और ब्राउज़र के लिए परीक्षण कर सकते हैं यह सुनिश्चित करने के लिए कि सत्र एक ही क्लाइंट से आ रहा है। जैसे ही क्लाइंट ने सत्र ब्राउज़र को बंद कर दिया और आपको अपने विचारों को समाप्त करने की आवश्यकता होगी, सत्र को वास्तविक HTML में शामिल करने के बाद से आपको कैशिंग विचारों से सीमित कर दिया जाएगा। कम से कम मेरे लिए स्थानीय डिवाइस पर डेटा संग्रहीत करना वास्तव में एक विकल्प नहीं है क्योंकि यह क्लाइंट के लिए बहुत अधिक उजागर करता है जो मेरी राय में कहीं अधिक सुरक्षा जोखिम है।


आप इसे पोस्ट XmtHttpRequest के माध्यम से भी भेज सकते हैं, जैसे कि $.post()jQuery में उपयोग करना , फिर एक स्थानीय चर सेट करना। यदि आप सब कुछ एन्क्रिप्ट करते हैं, तो यह बहुत सुरक्षित है।
JVE999

@ JVE999 वेब दृश्य द्वारा डिफ़ॉल्ट रूप से सहेजे गए कुकीज़ को कैसे एन्क्रिप्ट करें?
लवफोर्डरॉइड

3

device_idसर्वर साइड पर कुछ रिकॉर्ड को संबोधित करने के लिए उपयोग करें । नाम के एक डेटाबेस तालिका बनाने के sessionसाथ अपने सर्वर पर device_id, cookiename, cookievalueऔर timestampस्तंभों के रूप में।

जब कोई ग्राहक आपके वेब सर्वर को फोनगैप ऐप के माध्यम से एक्सेस करता है, तो उसे प्राप्त करें device_idऔर कुकीज़ को अपनी तालिका में संग्रहीत करें। device_id hereपहुँच OAuth प्रोटोकॉल में टोकन के रूप में कार्य करता है।

अब सुरक्षा कारणों से आपको उन रिकॉर्ड की वैधता अवधि को कम करने की आवश्यकता है, क्योंकि डिवाइस_आईडी अनुज्ञादायी है और आपका ग्राहक एक दिन अपने फोन को बेचना चाहेगा। इसलिए, timestampक्लाइंट द्वारा अंतिम पहुंच को संग्रहीत करने के लिए उपयोग करें, और रिकॉर्ड को हटा दें यदि इसे एक्सेस नहीं किया गया है, तो 10 दिनों का कहना है।


3

मैं कॉर्डोवा 6.1 (इस समय नवीनतम संस्करण) का उपयोग कर रहा हूं और वास्तव में मुझे निम्नलिखित मिला:

अगर मैं document.cookie = ... का उपयोग करके जावास्क्रिप्ट को जावास्क्रिप्ट के माध्यम से सेट करता हूं, तो यह काम नहीं करता है। हालाँकि, अगर मैं एक फ़ंक्शन सेट करता हूं जैसे 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=/"; 
    }
} 

और उपयोग करते हुए सर्वर पर कुकी सेट करें

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

तब यह वास्तव में काम करता है!

उम्मीद है की यह मदद करेगा। चियर्स



0

बेशक आप कर सकते हैं।

आयनिक ऐप सिर्फ अजाक्स रिक्वेस्ट भेजते हैं, कुकी अच्छा काम करती है या सर्वर पर निर्भर नहीं होती है।

मैं अजगर Django सर्वर और नोड सर्वर के साथ काम किया है, दोनों कुकी बहुत अच्छी तरह से काम किया

नीचे नोड कोड

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

बाकी एपीआई

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

मुझे लगता है कि प्रश्न मूल रूप से कॉर्डोवा ऐप के लिए क्लाइंट साइड कुकी सेट करने के बारे में है। इस विषय पर अधिकांश जानकारी का तात्पर्य है कि क्लाइंट साइड कुकी सेट करना कॉर्डोवा के लिए काम नहीं करता है।

लेकिन मुझे एक प्लगइन मिला जिसने मुझे अपने कॉर्डोवा ऐप के लिए क्लाइंट साइड कुकीज़ सेट करने की अनुमति दी।

की जाँच करें https://www.npmjs.com/package/cordova-plugin-cartegraph-cookie-master

यह सिर्फ काम करता है!


0

कॉर्डोवा + एक्सएचआर अनुरोधों के साथ मेरे पास सत्र कुकी मुद्दे भी थे। कुकीज़ को हर ऐप रीस्टार्ट पर खो दिया जाता है। दो चीजों ने मेरे मुद्दों को हल किया है:

  1. कुकीज़ की समाप्ति तिथि होनी चाहिए।

  2. सभी XHR अनुरोधों को सही होने के लिए क्रेडेंशियल्स ध्वज सेट होना चाहिए ।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.