Menangani cookie di PhoneGap / Cordova

89

Saya sedang mengerjakan aplikasi PhoneGap dengan penggunaan sesi server. Dibutuhkan cookie untuk menangani sesi tersebut. Selain itu, cookie dari load balancer juga harus ditangani. Jadi tidak ada jalan lain. Bagaimana Anda menangani Cookies di aplikasi PhoneGap?

Saya telah menyelesaikan beberapa penelitian:

  • Beberapa orang mengatakan penanganan cookie mungkin bergantung pada server yang tidak menyetel cookie untuk agen pengguna yang tidak dikenal (IIS): sesi PhoneGap (cookie) di iOS
  • Dalam JavaScript, cookie dapat disetel dengan document.cookie = ..., tetapi tidak disimpan di PhoneGap dan hilang. Sebelum mengaktifkan permintaan xhr, ini berfungsi.
  • Cookie dapat diambil setelah permintaan xhr dengan xhr.getResponseHeader ('Set-Cookie'). Tetapi hanya jika benar-benar diatur di server. Sayangnya, jQuery menghapus header "Cookie".
  • Properti document.cookie JavaScript tidak ditetapkan dan tidak diperbarui setelah permintaan (xhr).
  • Beberapa menyarankan localStorage untuk menyimpan id sesi dll. Tetapi semua skrip dapat mengaksesnya dan ini mungkin merupakan masalah keamanan XSS. Cookies mengatasi masalah ini dengan menggunakan bendera httponly.
  • iOS: Ada beberapa modifikasi yang akan mengubah perilaku webView untuk mendukung cookie. Namun tampaknya tidak berfungsi dengan iOS 6 dan PhoneGap 2.5: https://groups.google.com/forum/?fromgroups=#!topic/phonegap/ZJE1nxX63ow
  • Cookies tampaknya diaktifkan secara default di AppDelegate.m (v2.5).
Bernd
sumber
Apa maksud Anda semua skrip dapat mengakses localStorage? Saya pikir itu terpisah dan agak di-sandbox untuk setiap aplikasi PhoneGap ... bukan?
jayarjo
Mungkin plugin ini membantu? github.com/assembly/cordova-cookie-jar
J Chris A

Jawaban:

68

Sobat, saya juga tidak berhasil menggunakan cookie dengan phonegap. Solusinya adalah menggunakan localStorage.

Contoh Cepat Utama:

 var keyName = window.localStorage.key(0);

Contoh Set Item Cepat:

 window.localStorage.setItem("key", "value");

Dapatkan Contoh Item Cepat

 var value = window.localStorage.getItem("key");
 // value is now equal to "value"

Hapus Item Contoh Cepat:

 window.localStorage.removeItem("key");

Hapus Contoh Cepat:

 window.localStorage.clear();

Jika Anda menggunakan javascript untuk seluler dan web, Anda dapat menggunakan kode ini untuk mendeteksi lingkungan itu:

var wl = window.location.href;
var mob = (wl.indexOf("android")>0);

Referensi: 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 # halaman-ke-sumber

Hati-hati: menggunakan navigasi anonim di iOS dapat membuat penyimpanan lokal tidak berfungsi seperti yang dipantau. Tes sederhana yang berfungsi dengan baik untuk saya:

$(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
sumber
1
Tiago, Mengenai jawaban Anda, bisakah Anda mengklarifikasi jika opsi Penyimpanan lokal tetap ada (tidak ada data yang hilang) sampai aplikasi dicopot? dan juga, dapatkah kami memastikan bahwa aplikasi lain tidak dapat menjangkau pasangan nilai kunci yang saya setel di aplikasi saya?
shamaleyte
2
@shamaleyte "LocalStorage bertindak lebih seperti cache daripada cookie, di mana persistensi masing-masing bergantung pada pengaturan browser pengguna, dan bagaimana browser itu sendiri mengimplementasikannya (karena tidak ada spesifikasi untuk itu)" stackoverflow.com/questions/9948284/…
Tiago Gouvêa
Tolong JANGAN gunakan penyimpanan lokal di Cordova! di iOS, proses sistem dapat menghabiskan penyimpanan lokal sesuka hati. pergihybrid.com/…
Nico Westerdale
4

Mirip dengan Anda, saya ingin menggunakan cookie yang ditetapkan oleh server dalam aplikasi saya sehingga aplikasi saya akan konsisten dengan web dan tidak memerlukan ID perangkat terpisah atau metode lain untuk otentikasi.

Apa yang saya temukan adalah sebagai berikut:

  • Cookie yang disetel melalui AJAX (mis. JQuery $.get()atau $.post()) tidak bertahan
  • Cookie diatur dalam 'inAppBrowser' jangan bertahan.

Cara agar cookie tetap ada adalah dengan menggunakan plugin inAppBrowser .

Pertama, siapkan server sederhana yang menerima sebagai parameter nilai kunci GET yang ingin Anda pertahankan. Saya orang python / tornado, jadi server saya mungkin terlihat seperti:

class PersistCookieHandler(tornado.web.RequestHandler):
   @tornado.gen.coroutine
   def get(self):
      token = self.get_argument('token')
      self.set_secure_cookie('token',token)

Kemudian, di aplikasi Anda:

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

Anda kemudian dapat menyebutnya sebagai berikut:

persistToken(
   someToken,
   function() {
       console.log("token persisted");
   },
   function() {
       console.log("something went wrong);
   }
);
Mike N
sumber
3

Anda juga dapat menambahkan id sesi ke url yang meminta dan bergantung pada bahasa aplikasi server, mengambil data sesi menggunakan nilai id sesi string kueri yang Anda berikan - contoh di PHP Anda dapat membuka sesi yang ada dengan meneruskan id sesi. Meskipun ini tidak disarankan karena risiko pembajakan sesi, Anda dapat dengan mudah menguji IP dan Browser untuk memastikan sesi tersebut berasal dari klien yang sama. Ini tentu saja mengharuskan Anda mengakhiri sesi Anda segera setelah klien menutup browser sesi dan akan membatasi Anda dari tampilan cache karena sesi akan disertakan dalam html yang sebenarnya. Menyimpan data di perangkat lokal bagi saya setidaknya bukanlah pilihan karena terlalu banyak mengekspos ke klien yang menurut saya merupakan risiko keamanan yang jauh lebih besar.

moderncode
sumber
Anda juga dapat mengirimkannya melalui postingan XmtHttpRequest, seperti menggunakan $.post()di jQuery, lalu menyetel variabel lokal. Jika Anda mengenkripsi semuanya, itu cukup aman.
JVE999
@ JVE999 bagaimana cara mengenkripsi cookie yang disimpan secara default oleh tampilan web?
LoveForDroid
3

Gunakan device_iduntuk menangani catatan tertentu di sisi server. Buat tabel database bernama sessionpada server Anda dengan device_id, cookiename, cookievaluedan timestampsebagai kolom.

Ketika klien mengakses server web Anda melalui aplikasi phonegap, dapatkan miliknya device_iddan simpan cookie di tabel Anda. The device_id herebertindak sebagai akses token protokol OAuth.

Sekarang demi alasan keamanan, Anda perlu mengurangi periode validitas record tersebut, karena device_id adalah permenant dan klien Anda ingin menjual ponselnya suatu hari nanti. Oleh karena itu, gunakan timestampuntuk menyimpan akses terakhir oleh klien, dan hapus catatan jika belum diakses selama, katakanlah 10 hari.

Abdullah Al-Salloum
sumber
3

Saya menggunakan Cordova 6.1 (versi terbaru saat ini) dan sebenarnya saya menemukan yang berikut:

Jika saya mengatur cookie melalui Javascript menggunakan document.cookie = ... maka itu tidak berfungsi. Namun jika saya mengirim fungsi setCookie melalui Ajax ke server dengan fungsi seperti

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=/"; 
    }
} 

dan mengatur cookie di sisi server menggunakan

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

maka itu benar-benar berhasil!

Semoga ini membantu. Bersulang

SF
sumber
0

Punya masalah yang sama, dan memutuskan untuk memindahkan evrth ke localStorage Saya menulis plugin sehingga Anda dapat menggunakannya juga: angular-cookies-mirror

uamanager
sumber
0

Tentu saja Anda bisa.

Aplikasi ionik hanya mengirim requset ajax, cookie berfungsi dengan baik atau tidak tergantung pada server.

Saya telah bekerja dengan server python Django dan server node, kedua cookie bekerja dengan sangat baik

kode simpul di bawah ini

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 istirahat

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

kode aplikasi ionik

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

Anda dapat memeriksa kode sumber saya di sini

wangjinyang.dll
sumber
0

Saya pikir pertanyaannya pada dasarnya adalah tentang mengatur cookie sisi klien untuk aplikasi cordova. Sebagian besar informasi tentang topik ini menyiratkan bahwa pengaturan cookie sisi klien tidak berfungsi untuk cordova.

Tetapi saya menemukan plugin yang memungkinkan saya mengatur cookie sisi klien untuk aplikasi cordova saya.

Lihat https://www.npmjs.com/package/cordova-plugin-cartegraph-cookie-master .

Ini berhasil!

BruceJo
sumber
0

Saya juga mengalami masalah cookie sesi dengan permintaan Cordova + XHR. Cookie akan hilang setiap kali aplikasi dimulai ulang. Dua hal telah menyelesaikan masalah saya:

  1. Cookie harus memiliki tanggal kedaluwarsa.

  2. Semua permintaan XHR harus memiliki flag withCredentials yang disetel ke true.

Moe
sumber