94

サーバーセッションを使用するPhoneGapアプリに取り組んでいます。セッションを処理するには Cookie が必要です。さらに、ロード バランサーからの Cookie も処理する必要があります。したがって、回避策はありません。PhoneGap アプリで Cookie をどのように処理しますか?

私はすでにいくつかの研究を行っています:

  • Cookie の処理は、サーバーが不明なユーザー エージェント (IIS) の Cookie を設定しないことに依存する可能性があると言う人もいます: iOS での PhoneGap セッション (Cookie)
  • JavaScript では document.cookie = ... で Cookie を設定できますが、PhoneGap には保存されず、失われます。xhr リクエストを発行する前に動作します。
  • xhr.getResponseHeader('Set-Cookie') を使用して、xhr リクエストの後に Cookie を取得できます。ただし、実際にサーバーに設定されている場合のみ。残念ながら、jQuery は「Cookie」ヘッダーを取り除きます。
  • JavaScript の document.cookie プロパティが割り当てられず、(xhr) リクエスト後に更新されません。
  • セッションIDなどを保存するためにlocalStorageを提案する人もいますが、すべてのスクリプトがそれにアクセスでき、これはXSSセキュリティの問題である可能性があります. Cookie は、httponly フラグを使用してこの問題を回避します。
  • iOS: Cookie をサポートするために webView の動作を変更するいくつかの変更があります。しかし、iOS 6 と PhoneGap 2.5 では動作しないようです: https://groups.google.com/forum/?fromgroups=#!topic/phonegap/ZJE1nxX63ow
  • AppDelegate.m (v2.5) では、Cookie がデフォルトで有効になっているようです。
4

9 に答える 9

69

友人、私も phonegap で Cookie を使用しようとしましたが、成功しませんでした。解決策は、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/en/6.x/cordova/storage/storage.html #page-toc-ソース

注意: iOS で匿名ナビゲーションを使用すると、localstorage がスペクトのように機能しない場合があります。私にとってはうまくいっている簡単なテスト:

$(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
            }
        }
    }
});
于 2013-05-15T12:23:42.190 に答える
6

あなたと同様に、アプリケーション内でサーバーによって設定された Cookie を使用して、アプリケーションが Web と一致し、別のデバイス ID やその他の認証方法を必要としないようにしたいと考えていました。

私が発見したことは次のとおりです。

  • AJAX (jQuery$.get()や など$.post()) 経由で設定された Cookie が保持されない
  • 「inAppBrowser」に設定された Cookie は保持されます

このように Cookie を永続化する方法は、inAppBrowserプラグインを使用することです。

最初に、保持するキー値パラメーターを GET パラメーターとして受け入れる単純なサーバーをセットアップします。私は python/tornado 派なので、私のサーバーは次のようになります。

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);
   }
);
于 2015-12-07T10:53:54.123 に答える
4

を使用してdevice_id、サーバー側の特定のレコードに対処します。、、および列として、sessionサーバー上で名前が付けられたデータベース テーブルを作成します。device_idcookienamecookievaluetimestamp

クライアントが phonegap アプリ経由で Web サーバーにアクセスすると、クライアントdevice_idの Cookie を取得してテーブルに保存します。はdevice_id here、OAuth プロトコルのアクセス トークンとして機能します。

セキュリティ上の理由から、これらのレコードの有効期間を短縮する必要があります。これは、device_id が永続的であり、クライアントがいつか電話を売りたいと考えているためです。したがって、timestampクライアントによる最後のアクセスを保存するために使用し、たとえば 10 日間アクセスされていない場合はレコードを削除します。

于 2014-08-24T16:55:38.270 に答える
3

私はCordova 6.1(現時点では最新バージョン)を使用していますが、実際には次のことがわかりました:

document.cookie = ... を使用して Javascript 経由で 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 , "/" );

それは実際に機能します!

お役に立てれば。乾杯

于 2016-03-31T13:26:59.807 に答える
3

また、セッション ID を要求元の URL に追加し、サーバー アプリケーションの言語に応じて、渡したクエリ文字列のセッション ID 値を使用してセッション データをフェッチすることもできます。PHP の例では、セッション ID を渡すことで既存のセッションを開くことができます。これはセッション ハイジャックのリスクがあるため推奨されませんが、IP とブラウザを簡単にテストして、セッションが同じクライアントからのものであることを確認できます。これにはもちろん、クライアントがセッション ブラウザーを閉じるとすぐにセッションを期限切れにする必要があり、セッションが実際の html に含まれるため、ビューのキャッシュが制限されます。少なくともローカルデバイスにデータを保存することは、クライアントにあまりにも多くの情報を公開するため、私の意見ではセキュリティリスクがはるかに大きいため、実際にはオプションではありません.

于 2013-06-06T11:28:14.457 に答える