2013-03-11 1 views
74

私は、サーバーセッションの使用方法でPhoneGapアプリケーションを開発中です。セッションを処理するにはクッキーが必要です。さらに、ロードバランサからのクッキーも処理する必要があります。だから周りに道はない。 PhoneGapアプリでCookieをどのように扱いますか?PhoneGap/Cordovaでのクッキーの処理

私はすでにいくつかの研究を達成しています

  • 一部はCookie処理が不明なユーザーエージェント(IIS)のためにクッキーを設定していないサーバーに依存する場合があります言う:JavaScriptのクッキーでPhoneGap session (cookies) on iOS
  • が文書で設定することができます。クッキー= ...が、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が有効になっているようです。
+0

すべてのスクリプトがlocalStorageにアクセスできますか?私はそれが別々のPhoneGapアプリごとにちょっとしたサンドボックスだと思った...いいえ? – jayarjo

+0

ここに:http://stackoverflow.com/questions/15184567/is-local-storage-for-a-phonegap-app-on-an-android-device-separate-from-the-built – jayarjo

+0

このプラグインは役に立ちますか? https://github.com/assembly/cordova-cookie-jar –

答えて

62

友人、私もphonegapでクッキーを使用すると成功しなかった。ソリューションは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-source

注意: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 
      } 
     } 
    } 
}); 
+1

Tiago、あなたの答えについては、アプリケーションがアンインストールされるまで、localStorageオプションが持続する(データが失われることはない)かどうかを明確にしてください。また、他のアプリがアプリで設定したKey-Valueペアに到達できないことを確認することは可能でしょうか? – shamaleyte

+2

@shamaleyte "LocalStorageは、それぞれの永続性がユーザのブラウザ設定に依存するクッキーではなく、キャッシュのように機能し、ブラウザ自体がどのように実装しているか(仕様はないため)" http://stackoverflow.com/質問/ 9948284/how-persistent-is-localstorage –

+0

コルドバではlocalstorageを使用しないでください! iOSでは、システムプロセスは自由にローカルストレージをフラッシュすることができます。 https://gonehybrid.com/dont-assume-localstorage-will-always-work-in-your-hybrid-app/ –

3

あなたはまた、要求元のURLにセッションIDを追加し、サーバアプリケーションの言語に応じて、あなたが渡されたクエリ文字列セッションIDの値を使用してセッション・データをフェッチすることができます - 例えば、 PHPでは、セッションIDを渡して既存のセッションを開くことができます。セッションハイジャックのリスクがあるため、これはお勧めできませんが、セッションが同じクライアントから来ていることをIPとブラウザで簡単にテストできます。これはもちろん、クライアントがセッションブラウザを閉じるとすぐにセッションを終了する必要があり、実際のhtmlにセッションが含まれているため、キャッシュの表示が制限されます。少なくとも私のためにローカルデバイスにデータを格納することは、クライアントにあまりにも多くを公開するという選択肢ではありません。これは私の意見では、はるかに大きなセキュリティリスクです。

+0

あなたは '$ .post()'を使ってXmtHttpRequestの投稿を使って送ることもできます。 jQueryを呼び出し、ローカル変数を設定します。すべてを暗号化すれば、それはかなり安全です。 – JVE999

+0

@ JVE999ウェブビューでデフォルトで保存されるクッキーを暗号化する方法は? – LoveForDroid

2

device_idを使用して、サーバー側の特定のレコードに対処してください。サーバー上にsessionというデータベーステーブルを作成し、device_idcookienamecookievalueおよびtimestampを列として作成します。

クライアントがphonegapアプリケーションを使用してWebサーバーにアクセスするときは、彼のdevice_idを取得してテーブルに保存します。 device_id hereはOAuthプロトコルのアクセストークンとして機能します。

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

3

私のアプリがウェブと一貫し、認証に別のデバイスIDやその他の方法を必要としないように、アプリケーション内のサーバーによって設定されたCookieを使用したいと思っていました。

私は何を発見すると、以下の通りです:AJAX(例えば、jQueryの$.get()または$.post())を介して設定された

  • クッキーは 'inAppBrowser' に設定
  • クッキーを持続しませんが持続します。

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

まず、永続化するGETパラメータのKey-Valueパラメータとして受け入れる単純なサーバーをセットアップします。私は、Python /竜巻の男だ、そう私のサーバーは、次のようになります。次のように

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

あなたはその後、これを呼び出すことができます:あなたのアプリで、

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

その後

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

私はCordova 6.1(現時点では最新版)を使用していますが、実際には次のものが見つかりました:

docuを使用してJavascriptでCookieを設定するとment.cookie = ...それは動作しません。しかし、私は

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

のような機能を持つサーバーにAjaxを経由して機能しますsetcookieを送信し、

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

を使用して、サーバー側でクッキーを設定した場合、それが実際に動作しません!

これが役に立ちます。 乾杯

0

は同じ問題を抱えていた、そしてあなたもそれを使用することができますので、私はプラグインを書いたのlocalStorage にevrthを移動することを決めた:もちろんangular-cookies-mirror

0

をすることができます。

イオンアプリはAJAXを送信するだけで、クッキーは正常に動作するかサーバーに依存しません。

私は両方のクッキーが

ノードコード

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は非常によく

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) 
    }); 
} 
、PythonのDjangoのサーバーとノードサーバとの仕事を持っています

you can check my sourse code here