ফোনগ্যাপ / কর্ডোভাতে কুকি পরিচালনা করা


89

আমি সার্ভার সেশন ব্যবহারের সাথে একটি ফোনগ্যাপ অ্যাপে কাজ করছি। সেশনটি পরিচালনা করার জন্য এটির কুকিজ দরকার। অতিরিক্তভাবে, লোড ব্যালান্সারের কুকিও হ্যান্ডেল করা উচিত। তাই আশেপাশে কোনও উপায় নেই। আপনি কীভাবে আপনার ফোনগ্যাপ অ্যাপে কুকিজ পরিচালনা করবেন?

আমি ইতিমধ্যে কিছু গবেষণা সম্পন্ন করেছি:

  • কেউ কেউ বলেন কুকি হ্যান্ডলিং অজানা ব্যবহারকারী এজেন্ট (আইআইএস) জন্য কুকি সেট না করা সার্ভারের উপর নির্ভর করে: আইওএস এ ফোনগ্যাপ সেশন (কুকিজ)
  • জাভাস্ক্রিপ্টে ডকুমেন্ট.কুকি = ... দিয়ে কুকিজ সেট করা যেতে পারে, তবে সেগুলি ফোনগ্যাপে সংরক্ষিত হয় না এবং হারিয়ে যায়। এক্সএইচআর অনুরোধ করার আগে এটি কাজ করে।
  • Xhr.getResponseHeader ('সেট-কুকি') এর সাথে এক্সএইচআর অনুরোধের পরে কুকিজগুলি পুনরুদ্ধার করা যাবে। তবে কেবলমাত্র সার্ভারে সেট করা থাকলেই। দুর্ভাগ্যক্রমে, jQuery "কুকি" শিরোনামটি সরিয়ে দেয়।
  • জাভাস্ক্রিপ্ট ডকুমেন্ট.কুকি সম্পত্তি বরাদ্দ করা হয় না এবং (xhr) অনুরোধের পরে আপডেট হয় না।
  • কেউ কেউ স্থানীয় স্টোরেজকে সেশন আইডি ইত্যাদি সংরক্ষণ করার পরামর্শ দেয় তবে সমস্ত স্ক্রিপ্ট এটি অ্যাক্সেস করতে পারে এবং এটি এক্সএসএস সুরক্ষা সমস্যা হতে পারে। কুকিরা এই সমস্যাটিকে ঘিরে httponly পতাকা ব্যবহার করে।
  • আইওএস: এমন কিছু পরিবর্তন রয়েছে যা কুকিজ সমর্থন করার জন্য ওয়েবভিউ আচরণে পরিবর্তন আনবে। তবে তারা আইওএস 6 এবং ফোনগ্যাপ 2.5 নিয়ে কাজ করছে না বলে মনে হচ্ছে: https://groups.google.com/forum/?fromgroups=#!topic/ iPhonegap/ZJE1nxX63ow
  • কুকিগুলি AppDelegate.m (v2.5) এ ডিফল্টরূপে সক্ষম হয়েছে বলে মনে হচ্ছে।

আপনি কী বলতে চাইছেন সমস্ত স্ক্রিপ্টগুলি স্থানীয় স্টোরেজ অ্যাক্সেস করতে পারে? আমি ভেবেছিলাম এটি আলাদা ছিল এবং প্রতিটি ফোনগ্যাপ অ্যাপের জন্য স্যান্ডবক্সযুক্ত ... না?
জয়য়ারজো


সম্ভবত এই প্লাগইন সাহায্য করে? github.com/assembly/cordova-cookie-jar
জে ক্রিস এ

উত্তর:


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/ iPhonegap_stores_stores.md.html# localStorage http://cordova.apache.org/docs/en/6.x/cordova/stores/stores.html # পৃষ্ঠা-টোক-উত্স

সচেতন থাকুন: আইওএসে বেনামে নেভিগেশন ব্যবহার করা লোকাল স্টোরেজগুলিকে অনুমান করা মতো কাজ করতে পারে না। একটি সাধারণ পরীক্ষা যা আমার পক্ষে ভাল কাজ করছে:

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

4
টিয়াগো, আপনার উত্তর সম্পর্কে, অ্যাপ্লিকেশনটি আনইনস্টল না হওয়া পর্যন্ত আপনি কি দয়া করে স্পষ্ট করে বলতে পারবেন লোকালস্টোরেজ বিকল্পটি অব্যাহত থাকলে (কোনও ডেটা হারাবে না)? এবং এছাড়াও, আমরা কি বলতে পারি যে এটি নিশ্চিতভাবেই যে আমার অ্যাপ্লিকেশনটিতে আমি সেট করেছিলাম এমন কী-মূল্যের জুটিতে অন্যান্য অ্যাপ্লিকেশনগুলি পৌঁছতে পারে না?
শ্যালমেটি

4
@ শামাল্যাইট "লোকালস্টোরেজ কুকিজের চেয়ে ক্যাশের মতো আরও কাজ করে, যেখানে প্রত্যেকের অধ্যবসায়ের ব্যবহারকারীর ব্রাউজার সেটিংসের উপর নির্ভর করে এবং ব্রাউজার নিজেই কীভাবে এটি প্রয়োগ করে (যেহেতু এটির জন্য কোনও চশমা নেই)" স্ট্যাকওভারফ্লো / প্রশ্নগুলি / 48৯৮৮৮৪৪/২
টিয়াগো গওভিয়া

কর্ডোভাতে লোকাল স্টোরেজ ব্যবহার করবেন না দয়া করে! আইওএসে সিস্টেম প্রক্রিয়া ইচ্ছায় লোকাল স্টোরেজ ফ্লাশ করতে পারে। gohybrid.com/…
নিকো ওয়েস্টারডেল

4

আপনার মত আমিও আমার অ্যাপ্লিকেশনের মধ্যে একটি সার্ভার দ্বারা সেট কুকিজ ব্যবহার করতে চেয়েছিলাম যাতে আমার অ্যাপ্লিকেশনটি ওয়েলের সাথে সামঞ্জস্য হয় এবং প্রমাণীকরণের জন্য একটি পৃথক ডিভাইস-আইডি বা অন্য পদ্ধতির প্রয়োজন হয় না।

আমি যা আবিষ্কার করেছি তা হ'ল:

  • AJAX এর মাধ্যমে কুকি সেট করা হয়েছে (যেমন jQuery $.get() বা$.post() ) স্থির থাকে না
  • কুকি একটি 'inAppBrowser' do সেট করে থাকে।

এভাবে কুকি ধরে রাখার উপায়টি হ'ল ব্যবহার করা হ'ল ইন অ্যাপব্রোজারটি প্লাগইন ।

প্রথমে, একটি সাধারণ সার্ভার সেটআপ করুন যা আপনি অবিরত রাখতে চান জিইটি প্যারামিটার কী-মান প্যারামিটার হিসাবে গ্রহণ করে। আমি একটি অজগর / টর্নেডো লোক, তাই আমার সার্ভারটি দেখতে দেখতে এটির মতো হতে পারে:

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 তেও সেশন আইডি যুক্ত করতে পারেন এবং সার্ভার অ্যাপ্লিকেশন ভাষার উপর নির্ভর করে আপনার পাস করা ক্যোরি স্ট্রিং সেশন আইডি মানটি ব্যবহার করে সেশন ডেটা আনুন - পিএইচপি-তে আপনি সেশন আইডিতে পাস করে একটি বিদ্যমান সেশনটি খুলতে পারেন। সেশন হাইজ্যাকিংয়ের ঝুঁকির কারণে এটির প্রস্তাবিত নয় যদিও আপনি একই আইপি এবং ব্রাউজারটি পরীক্ষা করতে পারবেন যে সেশনটি একই ক্লায়েন্টের কাছ থেকে আসছে কিনা তা নিশ্চিত করতে। এটি অবশ্যই প্রয়োজন আপনার ক্লায়েন্টটি সেশন ব্রাউজারটি বন্ধ করার সাথে সাথেই আপনার সেশনটির মেয়াদ শেষ হয়ে যাবে এবং আসল এইচটিএমএলটিতে সেশনটি অন্তর্ভুক্ত হওয়ার কারণে আপনি ক্যাশে দেখা থেকে সীমাবদ্ধ রাখবেন। কমপক্ষে আমার জন্য স্থানীয় ডিভাইসে ডেটা সংরক্ষণ করা আসলে কোনও বিকল্প নয় কারণ এটি ক্লায়েন্টের কাছে খুব বেশি প্রকাশ করে যা আমার মতে যে কোনও সুরক্ষার ঝুঁকি রয়েছে।


আপনি এটি কোনও পোস্ট এক্সএমটিএইচটিপিআরকোয়েস্টের মাধ্যমেও পাঠাতে পারেন, যেমন $.post()jQuery ব্যবহার করার পরে, স্থানীয় ভেরিয়েবল সেট করুন। আপনি যদি সমস্ত কিছু এনক্রিপ্ট করেন তবে এটি বেশ সুরক্ষিত।
JVE999

@ JVE999 ওয়েব ভিউ দ্বারা ডিফল্টরূপে সংরক্ষিত কুকিগুলি কীভাবে এনক্রিপ্ট করবেন?
লাভফোরড্রয়েড

3

device_idসার্ভার সাইডে নির্দিষ্ট রেকর্ডগুলি সম্বোধন করতে ব্যবহার করুন । নামে একটি ডাটাবেস টেবিল তৈরি করুন sessionসঙ্গে আপনার সার্ভারে device_id, cookiename, cookievalueএবংtimestamp কলাম হিসাবে।

যখন কোনও ক্লায়েন্ট ফোন ওয়েব অ্যাপের মাধ্যমে আপনার ওয়েব সার্ভারটি অ্যাক্সেস করে, তখন সেটিকে পান device_idএবং আপনার টেবিলটিতে কুকিগুলি সংরক্ষণ করুন। দ্যdevice_id hereএক্সেস OAuth প্রোটোকল IN টোকেন হিসাবে কাজ করে।

সুরক্ষার কারণে এখন আপনাকে সেই রেকর্ডগুলির মেয়াদকাল হ্রাস করতে হবে, কারণ ডিভাইস_আইডি বর্ধমান এবং আপনার ক্লায়েন্টরা তাদের ফোনগুলি একদিন বিক্রি করতে চাইবে। অতএব, timestampক্লায়েন্টের দ্বারা সর্বশেষ অ্যাক্সেস সঞ্চয় করতে ব্যবহার করুন, এবং রেকর্ডটি যদি এটির জন্য অ্যাক্সেস না করা হয় তবে এটি মুছুন 10 দিন say


3

আমি কর্ডোভা 6.1 ব্যবহার করছি (এই মুহূর্তে নতুন সংস্করণ) এবং আসলে আমি নিম্নলিখিতটি পেয়েছি:

আমি যদি জাভাস্ক্রিপ্টের মাধ্যমে ডকুমেন্ট.কুকি = ব্যবহার করে কুকি সেট করি তবে এটি কার্যকর হয় না। তবে যদি আমি আজাক্সের মাধ্যমে কোনও ফাংশন সেটকুকি সার্ভারে পাঠায় তবে এর মতো একটি ফাংশন রয়েছে

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

অবশ্যই আপনি করতে পারেন.

আয়নিক অ্যাপ্লিকেশন কেবল একটি এজ্যাক্স রিক্সেট পাঠায়, কুকি ভাল কাজ করে বা সার্ভারের উপর নির্ভর করে না।

আমি পাইথন জ্যাঙ্গো সার্ভার এবং নোড সার্ভার নিয়ে কাজ করেছি, উভয় কুকি খুব ভালভাবে কাজ করেছে

নীচের নোড কোড

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. সমস্ত এক্সএইচআর অনুরোধের অবশ্যই শংসাপত্রের পতাকাটি সত্য হিসাবে সেট করা থাকতে হবে ।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.