web-dev-qa-db-ja.com

iPhoneの「ホーム画面のブックマーク」でCookieとセッションが削除されますか?

現在、ユーザーが最初にログインする必要があるWebベースのアプリケーションを開発しています。

IPhone Safariでページを開いてログインし、Safariを再起動しても、ログインしたままです(CookieとセッションIDはまだ設定されています)。

しかし、「ホーム画面に追加」でこのページを追加すると、そのページのアイコンをクリックするたびに、再度ログインする必要があります。

それに関する情報は見つかりませんでした。ユーザーがこのページをアイコンとしてホーム画面に設定しても、ユーザーが開くたびにログインする必要がないようにするにはどうすればよいですか?

40

本当に簡単なアプローチは、ブックマークURLで一意のトークンを使用することです。これは、一意のデバイス識別子として機能します。

例: http://myWebApp.com/?token=randomId29238/1

トークンは、Mobile Safariでアプリケーションを開いたとき、ユーザーに「ホーム画面に追加」情報が表示される前に、サーバー側で生成できます。次に、クイックリダイレクト(…&token = randomToken)またはロケーションハッシュ(…#randomToken)を使用して、トークンをURLに追加できます。

ブックマークがホーム画面から開かれると、トークンがサーバーに送信され、ユーザーのアクティブなセッションを識別できます。トークンを永続的なセッションIDとして使用することもできますが、セキュリティ上の懸念があるため、これはお勧めしません。

今後のログアウトおよびログイン手順を許可するために、常に新しいセッションをトークンに割り当てることができます。

トークンは、ユーザーがホーム画面からリンクを再び開くたびに、一意のデバイス識別子として機能します。

14
favo

Favoのソリューションよりも簡単で、よりエレガントなソリューションがあります。

少なくともiOS 4.2.1、5.1.1、6.0、6.1では(他のバージョンをテストできませんでした)、セッションCookieの有効期間を手動で延長すると、SafariはセッションCookieを保持し、Cookieの共有さえ可能にしますWebアプリの「ホーム画面にインストールされた」バージョンとSafari自体を介した通常のアクセスとの間のセッション。

トリックはこれを行うことです:

// Start or resume session
session_start(); 

// Extend cookie life time by an amount of your liking
$cookieLifetime = 365 * 24 * 60 * 60; // A year in seconds
setcookie(session_name(),session_id(),time()+$cookieLifetime);

この戦略のより詳細な説明については、この質問に対する私の回答をご覧ください。

Maintain PHP iPhoneのWebアプリのセッション

13
Wilbo Baggins

Waldo Bagginsの答えをもう少し詳しく説明します。

私がこれに遭遇したとき、これが発生している理由を発見しました。サーバーに設定されたセッションCookieには通常、有効期限の値が設定されていないためです。この場合のデフォルトの動作は、ブラウザーが閉じられたとき、または再度開かれたときにブラウザーがCookieを破棄することです。ブラウザは再オープン時にCookieを再送信しないため、サーバーでセッションがまだ期限切れになっていない場合でも、サーバーはセッションを識別する方法がなく、ユーザーはログインページにリダイレクトされます。

ユーザーがWebアプリモード(ホーム画面に追加されたアイコン)でサイトを使用している場合、iOSは、デスクトップコンピューターがブラウザーを閉じたり再度開いたりするのと同じ方法でアプリへのナビゲートを処理し、再度開いたときにセッションを失います。

Wilboの提案に従い、Cookieの有効期限を設定すると、iOSは、ユーザーがアプリに戻ったときにCookieの有効期限が切れているかどうかを確認し、期限切れになっていない場合はCookieを再送信して、セッションを維持します。ウィルボの答えの1年の値は途方もなく長いので、通常はこれを8時間または24時間のような値に設定し、サーバーに設定したセッションの有効期限のタイムアウト値と同期させるのが理想的です。

副作用として、デスクトップブラウザーからサイトにアクセスし、ユーザーがブラウザーを閉じて再度開いた場合、セッションは継続し、ユーザーは引き続きログインすることに注意してください。以前のケース(非公開で閲覧していた場合を除く)。 「ログアウト」機能は、このCookieの期限切れを適切に処理する必要があります。

Java web.xmlバージョン3.0以降を使用するwebappの場合、これを行う最も簡単な方法は<session-config> 次のように:

<session-config>
    <session-timeout>600</session-timeout> <!-- In minutes -->
    <cookie-config>
        <http-only>true</http-only>
        <secure>true</secure>
        <max-age>36000</max-age> <!-- In seconds -->
    </cookie-config>
</session-config>
4
Jeshurun

Webアプリで使用できる永続的なKey-Valueストレージとデータベースストレージがあります。 localStorageオブジェクトを使用して認証データを保存し、XMLHttpRequestを使用して送信できますそれをサーバーに。別のオプションは、永続データをSQLiteデータベースに保存することですが、これはあなたの場合には適切な解決策ではないようです。詳細/例については、Appleの クライアント側のストレージおよびオフラインアプリケーションのプログラミングガイド をご覧ください。

3
kervich