web-dev-qa-db-ja.com

PHPでモバイルアプリからログインしたユーザーのセッションを管理する方法

私はPHPプログラマー職業です。そのため、iOSとAndroidコーディング。

このシナリオでは、ソーシャルネットワーキングPHP "PHPFox"というタイトルのソフトウェアを使用して開発された1つのWebサイトがあります。

現在、このWebサイトの機能を正確に複製する2つの類似したモバイルアプリがあります。 1つのモバイルアプリはiOSにあり、別のモバイルアプリはAndroidにあります。

そこで、モバイルアプリからのリクエストを受け入れ、リクエストを解析し、ウェブサイトで同じジョブを実行する関数にリクエストパラメータを渡し、この関数から応答を取得し、変換するRESTful APIのセットを作成しましたJSON形式に変換してモバイルアプリに送り返しました。 iOSおよびAndroid appの場合、REST APIファイルの同じセットを使用しています。

ユーザーがログインすると、RESTログイン用のAPIが呼び出されます。最終的に認証用のPHPFox関数が呼び出され、他のユーザーデータとともにセキュリティトークンが生成されます。ログインごとに異なるセキュリティトークンこのデータはセッションに設定されます。REST APIファイルを介して関数を呼び出すたびに、ログイン時に生成されたセキュリティトークンが検証され、 PHPFox関数が呼び出されるトークンの検証に成功します。この検証プロセスはPHPFoxによって内部的に行われます。したがって、明示的にまたは暗黙的にセキュリティトークンを任意のREST API呼び出しに渡す必要はありません。

今まではすべてが完全に機能します。

私の疑問はここから始まります。セッションがiOS/Androidアプリで維持されているかどうかわかりません。サーバー上のセッション、つまりPHPFoxがタイムアウトした場合、アプリはどうなりますか?クラッシュしますか?ユーザーは再度ログインする必要がありますか?ユーザーがデバイスでアプリを強制終了し、再びアプリにアクセスした場合、ログインプロセスを再度行う必要がありますか?

私の心にはあまりにも多くの疑問があります。私はこれらのことと完全に混同されます。

誰かが私が直面している問題にもっと焦点を当ててください。あなたが詳細に説明できれば本当に素晴らしいでしょう。

ありがとう。

41
PHPLover

RESTはその性質上、セッションレスです。ユーザーがログインしたときにトークンを生成する必要があります。このトークンをモバイルクライアントに保存する必要があります。リクエストごとに、リクエストヘッダーに有効なトークンを添付し、サーバー側で確認する必要があります。トークンの有効期限が切れると、クライアントに保存されているトークンは無効になります。そのため、401応答のため、再度ログインする必要があります。トークンが正しくない場合は、400に応答する必要があります。私があなたの役に立つことを願っています。

54
valeriocomo

Webブラウザとは異なり、iOSおよびAndroidアプリはセッションを維持できません。通常、ユーザーがログインすると(サーバーから検証されたログイン資格情報)、そのログイン資格情報はクライアント側に保存されます。セッションを使用したサーバーからのデータless REST api呼び出し。これは、モバイルアプリケーションで最も多く行われる方法です。

ただし、サーバーセッションとモバイルアプリを連動させたい場合(これは良い考えではないと思います)、方法は

1)ユーザーがログインすると、サーバー側でセキュリティトークンが生成され、サーバー側とクライアント側の両方に保存されます。

2)モバイルアプリは、セキュリティトークンが有効である限り、サーバーと通信できます。

3)セッションの有効期限が切れると、セキュリティトークンは無効になります。セッションが期限切れになったときの応答について、サーバーとクライアントの間で理解する必要があります。これで、モバイルアプリはユーザーを再度ログインページにリダイレクトする必要があります。ユーザーは再度ログインし、サーバーと通信します。これは、セッションが期限切れになるたびに発生するはずです。

20
Fawad Masud

あなたがOauth 2を認証に使用している場合、一般的なセットアップは次のとおりです。

  • ユーザーはモバイルアプリにログインします
  • 資格情報に問題がない場合、サーバーはアクセストークン、更新トークン、およびトークンの有効期間を返します
  • モバイルアプリはこれらの値と現在のタイムスタンプを保存します
  • サーバー側では、ガベージコレクターが期限切れのトークンをクリアするように構成されています
  • Api呼び出しを行う前に、モバイルアプリはトークンが期限切れになりそうかどうかを確認します(保存された値を使用)。トークンの有効期限が近づいている場合、アプリはサーバーに新しいアクセストークンを生成するよう指示する更新トークンを送信します
  • ユーザーが接続を維持するようにしたい場合は、アクセストークンを定期的に確認し、古い場合は新しいトークンを要求するようにアプリを構成できます。

お役に立てれば。

乾杯

15
Valéry

サーバーは完全にステートレスである必要があるため、セッションを保存しないでください。REST APIは、事実上、オプションのセキュリティを備えた単なるデータ抽象化レイヤーです(トークン経由)

したがって、APIは認証サービスを公開します。認証サービスは、後続のリクエストでヘッダーとして使用されるAuthorizationトークンで応答します。このトークンは、各ユーザーと1対1の関係で、Universally Uniqueである必要があります。また、有効期限が必要です。この時点で、サーバーは適切なエラー応答で応答し、トークンを更新するようアプリに要求します。 。

サーバーではなく、状態を維持するのはAPPです。サーバーはデータ目的のためだけに存在するため、セッションベースの認証には一切依存しないでください。

8
RaggaMuffin-420

モバイル開発側からのセッションについて心配する必要はありません。iOSについてはあまり知りませんが、AndroidではSharedPrefrence(セッションをローカルに維持するフラグ)を使用します。

4
Puneet Ahuja

セッションは、サーバー上に存在する「何か」です。ユーザーに関する詳細(セッションID、ユーザー名、電子メールアドレスなど)または将来のリクエストを処理するために必要なその他のデータ(ショッピングカートの詳細、配送先住所など)を格納するオブジェクトです。

通常、その「何か」はオブジェクトであり、メモリ、データベース、またはシリアル化してファイルシステムに保存することもできます(PHPのデフォルトだと思います)。

したがって、「セッションがiOS/Androidアプリで維持されているかどうかわからない」と言うとき、それは意味をなさないと思います。サーバーのみがセッションを維持できます。

通常、クライアントが知る唯一のこと(Webブラウザーまたはモバイルアプリ)は、セッションID(トークンまたはGUIDの形式)です。これは、クライアント/アプリが覚えておく必要がある唯一のものであり、サーバーへのリクエストと一緒に送信する必要があります。

Cookieとして保存したり、リクエストヘッダーとしてサーバーに送信したりできます。

次に、サーバーはCookieまたはヘッダーからセッションID /トークンを読み取り、セッションを保存する場所(ファイルシステム、メモリ、またはデータベース)からセッションの詳細を取得します。 session_start()を呼び出すと、それが舞台裏で起こります。

セッション処理およびカスタムセッションハンドラーの作成方法の詳細を読むには(リクエストヘッダーからトークンを取得するために必要な場合があります):
http://php.net/manual/en/function.session-start.php

3
Alex Sanséau

PHPFoxの使用経験はありませんが、これがモバイルフロントエンドが理想的に問題を処理する方法です。

ケース1:サーバーとアクティブに通信しているモバイルアプリ:

  • セッションタイムアウトスタンプは増加し続け、セッションは存続します。

ケース2:サーバー通信なしでアクティブなモバイルアプリ(電話の着信、アプリ間の移動など):

  • サーバーセッションはタイムアウトする場合としない場合があります。
  • タイムアウトになると、サーバーへの次のクエリは認証に失敗し、エラーが返されます。
  • アプリはこのエラーを消費し、ユーザーにログインを促すメッセージトーストを表示してログイン画面に適切にリダイレクトします。 (これは私の銀行アプリで起こります)

ケース3:ユーザーがデバイスでアプリを強制終了し、再起動する:

  • アプリは、トークンをsqlliteまたは共有設定に保存する必要があります。 (常にログインしているアプリはこのアプローチを取ります)
  • 再起動すると、アプリは既存のトークンを使用してサーバーにクエリを実行できます。
  • セッションが生きている場合、通信が行われ、ユーザーは続行できます。そうでない場合、ユーザーはケース2のようにログイン画面に進みます。
3
Sanand Sule