Xử lý cookie trong PhoneGap / Cordova


88

Tôi đang làm việc trên một ứng dụng PhoneGap có sử dụng phiên máy chủ. Nó cần cookie để xử lý phiên. Ngoài ra, cookie từ bộ cân bằng tải cũng phải được xử lý. Vì vậy, không có cách nào xung quanh. Bạn xử lý Cookies trong ứng dụng PhoneGap của mình như thế nào?

Tôi đã hoàn thành một số nghiên cứu:

  • Một số người nói rằng việc xử lý cookie có thể phụ thuộc vào việc máy chủ không đặt cookie cho tác nhân người dùng không xác định (IIS): Phiên PhoneGap (cookie) trên iOS
  • Trong JavaScript, cookie có thể được đặt bằng document.cookie = ..., nhưng chúng không được lưu trong PhoneGap và bị mất. Trước khi kích hoạt các yêu cầu xhr nó hoạt động.
  • Cookie có thể được truy xuất sau khi yêu cầu xhr với xhr.getResponseHeader ('Set-Cookie'). Nhưng chỉ khi thực sự đặt trên máy chủ. Thật không may, jQuery loại bỏ tiêu đề "Cookie".
  • Thuộc tính JavaScript document.cookie không được chỉ định và không được cập nhật sau các yêu cầu (xhr).
  • Một số đề xuất localStorage để lưu id phiên, v.v. Nhưng tất cả các tập lệnh đều có thể truy cập nó và đây có thể là vấn đề bảo mật XSS. Cookie giải quyết vấn đề này bằng cách sử dụng cờ httponly.
  • iOS: Có một số sửa đổi sẽ thay đổi hành vi của webView để hỗ trợ cookie. Nhưng chúng dường như không hoạt động với iOS 6 và PhoneGap 2.5: https://groups.google.com/forum/?fromgroups=#!topic/phonegap/ZJE1nxX63ow
  • Cookie dường như được bật theo mặc định trong AppDelegate.m (v2.5).

Ý bạn là tất cả các script đều có thể truy cập localStorage? Tôi nghĩ rằng nó là riêng biệt và được đóng hộp cát cho từng ứng dụng PhoneGap ... không?
jayarjo


Có lẽ plugin này giúp ích? github.com/assembly/cordova-cookie-jar
J Chris A

Câu trả lời:


68

Bạn ơi, tôi cũng đã thử sử dụng cookie với phonegap mà không thành công. Giải pháp là sử dụng localStorage.

Ví dụ nhanh chính:

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

Ví dụ nhanh về Đặt mục:

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

Ví dụ nhanh về lấy hàng

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

Ví dụ nhanh về Xóa mục:

 window.localStorage.removeItem("key");

Xóa ví dụ nhanh:

 window.localStorage.clear();

Nếu bạn sử dụng javascript cho cả di động và web, bạn có thể sử dụng mã này để phát hiện môi trường đó:

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

Tài liệu tham khảo: 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

Lưu ý: việc sử dụng điều hướng ẩn danh trên iOS có thể làm cho localstorage không hoạt động như phổ biến. Một bài kiểm tra đơn giản đang hoạt động tốt với tôi:

$(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
Tiago, Về câu trả lời của bạn, bạn có thể vui lòng làm rõ nếu tùy chọn localStorage vẫn tồn tại (không xảy ra mất dữ liệu) cho đến khi ứng dụng được gỡ cài đặt? và ngoài ra, chúng ta có thể nói rằng có chắc chắn rằng các ứng dụng khác không thể đạt được cặp khóa-giá trị mà tôi đã đặt trong ứng dụng của mình không?
shamaleyte

2
@shamaleyte "LocalStorage hoạt động giống như bộ nhớ cache hơn là cookie, trong đó mức độ tồn tại của mỗi thứ phụ thuộc vào cài đặt trình duyệt của người dùng và cách trình duyệt tự triển khai nó (vì không có thông số kỹ thuật cho nó)" stackoverflow.com/questions/9948284/…
Tiago Gouvêa

Vui lòng KHÔNG sử dụng localstorage ở Cordova! trong iOS, quá trình hệ thống có thể xóa lưu trữ cục bộ theo ý muốn. gohybrid.com/…
Nico Westerdale,

4

Tương tự như bạn, tôi muốn sử dụng cookie do máy chủ đặt trong ứng dụng của mình để ứng dụng của tôi nhất quán với web và không yêu cầu ID thiết bị riêng hoặc phương pháp khác để xác thực.

Những gì tôi phát hiện ra là sau:

  • Cookie được đặt qua AJAX (ví dụ: jQuery $.get()hoặc $.post()) không tồn tại
  • Các cookie được đặt trong một 'inAppBrowser' làm kiên trì.

Do đó, cách để cookie tồn tại là sử dụng plugin inAppBrowser .

Đầu tiên, thiết lập một máy chủ đơn giản chấp nhận tham số GET các tham số khóa-giá trị mà bạn muốn duy trì. Tôi là một anh chàng trăn / lốc xoáy, vì vậy máy chủ của tôi có thể trông như sau:

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

Sau đó, trong ứng dụng của bạn:

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

Sau đó, bạn có thể gọi nó như sau:

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

3

Bạn cũng có thể nối id phiên vào url yêu cầu và tùy thuộc vào ngôn ngữ ứng dụng máy chủ, tìm nạp dữ liệu phiên bằng cách sử dụng giá trị id phiên chuỗi truy vấn mà bạn đã chuyển - ví dụ trong PHP, bạn có thể mở phiên hiện có bằng cách chuyển vào id phiên. Mặc dù điều này không được khuyến nghị do rủi ro bị chiếm quyền điều khiển phiên, nhưng bạn có thể dễ dàng kiểm tra IP và Trình duyệt để đảm bảo phiên đến từ cùng một máy khách. Điều này tất nhiên sẽ yêu cầu bạn hết hạn phiên của mình ngay sau khi khách hàng đóng trình duyệt phiên và sẽ giới hạn bạn khỏi các chế độ xem bộ nhớ đệm vì phiên sẽ được bao gồm trong html thực tế. Lưu trữ dữ liệu trên thiết bị cục bộ đối với tôi ít nhất không thực sự là một lựa chọn vì nó để lộ quá nhiều cho khách hàng, theo tôi là một rủi ro bảo mật lớn hơn nhiều.


Bạn cũng có thể gửi nó qua một bài đăng XmtHttpRequest, chẳng hạn như sử dụng $.post()trong jQuery, sau đó đặt một biến cục bộ. Nếu bạn mã hóa mọi thứ, điều đó khá an toàn.
JVE999

@ JVE999 làm cách nào để mã hóa cookie được lưu theo mặc định trong chế độ xem web?
LoveForDroid

3

Sử dụng device_idđể giải quyết các bản ghi nhất định ở phía máy chủ. Tạo một bảng cơ sở dữ liệu tên sessiontrên máy chủ của bạn với device_id, cookiename, cookievaluetimestampnhư cột.

Khi khách hàng truy cập vào máy chủ web của bạn thông qua ứng dụng phonegap, hãy lấy device_idvà lưu trữ cookie của họ trong bảng của bạn. Hoạt device_id heređộng như một mã thông báo truy cập trong giao thức OAuth.

Bây giờ vì lý do bảo mật, bạn cần giảm thời hạn hiệu lực của các bản ghi đó, vì device_id là lâu dài và khách hàng của bạn sẽ muốn bán điện thoại của họ vào một ngày nào đó. Do đó, hãy sử dụng timestampđể lưu trữ lần truy cập cuối cùng của máy khách và xóa bản ghi nếu nó chưa được truy cập trong 10 ngày.


3

Tôi đang sử dụng Cordova 6.1 (phiên bản mới nhất tại thời điểm này) và thực sự tôi đã tìm thấy những điều sau:

Nếu tôi đặt cookie qua Javascript bằng document.cookie = ... thì nó không hoạt động. Tuy nhiên, nếu tôi gửi một hàm setCookie qua Ajax đến máy chủ có chức năng như

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

và đặt cookie ở phía máy chủ bằng cách sử dụng

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

thì nó thực sự hoạt động!

Hi vọng điêu nay co ich. Chúc mừng


0

Gặp phải vấn đề tương tự và quyết định chuyển evrth sang localStorage, tôi đã viết plugin để bạn cũng có thể sử dụng nó: angle-cookies-mirror


0

tất nhiên bạn có thể.

ứng dụng ionic chỉ cần gửi ajax requset, cookie hoạt động tốt hay không phụ thuộc vào máy chủ.

tôi đã làm việc với máy chủ python Django và máy chủ nút, cả hai cookie đều hoạt động rất tốt

mã nút bên dưới

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

nghỉ ngơi 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))
});

mã ứng dụng ion

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

bạn có thể kiểm tra mã sourse của tôi ở đây


0

Tôi nghĩ câu hỏi về cơ bản là về việc đặt cookie phía máy khách cho ứng dụng cordova. Hầu hết thông tin về chủ đề này ngụ ý rằng việc đặt cookie phía máy khách không hoạt động đối với cordova.

Nhưng tôi đã tìm thấy một plugin cho phép tôi đặt cookie phía máy khách cho ứng dụng cordova của mình.

Kiểm tra https://www.npmjs.com/package/cordova-plugin-cartegraph-cookie-master .

Nó chỉ hoạt động!


0

Tôi cũng gặp sự cố về cookie phiên với các yêu cầu Cordova + XHR. Cookie bị mất sau mỗi lần khởi động lại ứng dụng. Hai điều đã giải quyết vấn đề của tôi:

  1. Cookie phải có ngày hết hạn.

  2. Tất cả các yêu cầu XHR phải có cờ withCredentials được đặt thành true.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.