次のシナリオを検討してください: Webアプリケーションは2つの別々のシステムを使用しています(DBを介してデータ/状態を共有できます)。 1つ目は、HTTPリクエスト/レスポンス、HTMLコンテンツ、フォームなど、関連するすべての標準的なWeb処理に使用されます。 2番目は、メッセージや通知の送信などのリアルタイム通信に使用されます(ロングポーリングまたはWebSocketサーバー)。
ユーザーは最初のシステム/プラットフォームを介して認証され、資格情報が有効な場合、一部のWebページがクライアントに返送されます。このページが読み込まれると、クライアントはバックグラウンドで透過的に2番目のシステム/プラットフォームに接続されます。
質問は:バックエンドの複数のシステム/プラットフォームで構成されるWebページ/アプリケーションでユーザーを認証する方法?
私はそれをこのように想像することができます:
このアプローチは、たとえば盗聴に対して脆弱であることを理解していますが、私は特に、2つの別個のシステム/プラットフォーム間の認証手順に興味があります。
あなたが持っているもののほとんど。一度に複数の有効なセッションが必要かどうか、およびセッションの期限切れをどうするかを検討してください。
以下のクレイジーなコメントスレッドの編集
1番目のサーバーと通信せずに2番目のサーバーによって検証されるトークンをクライアントに提供することはできますが、醜く、多くの作業を伴います。このようなシナリオでは、クライアントが処理しない限り、セッションを無効にすることはできません。トークンが渡されるとき、トークンのタイムスタンプ、2番目のシステムによるトークンの追跡、トークンの通過における署名またはHMACなどの特定の時間枠も必要です。これら2つのシステムがインターネット上でお互いを認識できない場合を除き、それは完全に混乱しています。
私は両方のシステムが同じデータベースにアクセスできることを収集しますが、何らかの理由でアクセスできなかった場合、リモートで検証できる2番目のシステムにAPIを公開することも適切です(secret.page?checkUser=token ...またはそのような)。
SSLなしでは、Firesheep/MITM攻撃によるセッションハイジャックを防ぐ方法はありません。
私の推奨は、プライマリユーザー認証に使用される単一のWebアプリです。
注:Cookieの性質上、この方法はWebアプリケーションが共通のドメインを共有している場合にのみ機能します。 (つまり、appone.example.comとapptwo.example.com)
openidは同様のことを行いますが、Cookieの問題を回避します。
これがどのように機能するか
-などの追加情報をこの転送Cookieに入れる必要があります
例については、以下を参照してください。 https://www.login.mtu.edu/docs/public/mtuiso/howitworks2.html
これは、ユーザーの観点からはほとんど見た目が悪くなります。たとえば。
4つのオプション、1つ目は最大コスト(お金とパフォーマンスの両方)、3つ目は最も安い
Siteminder、Novell、Tivoliなどのソリューションを導入
DBでのセッション状態の維持。これを行うため。このアプローチの問題は、ログアウト、セッションの有効期限を追跡し、2つのアプリケーション間でこの情報を伝達することが難しいことです。各リクエストの前にDBをクエリすると、非常にコストがかかるため
セッション状態を管理するためだけにサードアプリケーションを使用する。このアプリケーションは、2つのアプリケーションにのみアクセスできるネットワーク内でのみ制限されているエンドユーザーに公開されません。すべてのユーザーの状態をアプリケーションコンテキストに保存し、2つのアプリケーションがこのアプリケーションにリクエストを送信します
ログインイベント時ログアウトイベント時セッションの有効性を確認する要求を処理する前のセッション期限切れイベント時
Cookieの使用(両方のアプリケーションが同じ親ドメインを共有することを前提としています)
ユーザー名+ソルト/エクレットキーを含むCookieを作成し、この暗号化された秘密キーと暗号化キーは両方のアプリケーションで使用されますユーザーは他のアプリケーションにログインしています