ホームページ  >  記事  >  バックエンド開発  >  PHP での SSO シングル サインオンの実装方法の詳細な分析

PHP での SSO シングル サインオンの実装方法の詳細な分析

青灯夜游
青灯夜游転載
2021-07-09 19:15:344790ブラウズ

SSO は、複数のアプリケーション システムにおいて、ユーザーは一度ログインするだけで、相互に信頼されているすべてのアプリケーション システムにアクセスできることを意味します。では、PHP で SSO シングル サインオンを実装するにはどうすればよいでしょうか?次の記事では、シングル サインオン SSO の実装について詳しく説明します。

PHP での SSO シングル サインオンの実装方法の詳細な分析

SSO (Single Sign On)、つまりシングル サインオンは、複数の関連する独立したシステムを制御するアクセス権限の一種です。単一の ID とパスワードで 1 つ以上のシステムにアクセスし、異なるユーザー名やパスワードの使用を回避したり、各システムにシームレスにログインできるように構成したりできます。

大規模システムの場合、シングル サインオンを使用すると、ユーザーの多くのトラブルを軽減できます。 Baidu を例に挙げると、Baidu の下には、Baidu Experience、Baidu Knows、Baidu Library などの多くのサブシステムがあります。これらのシステムを使用する場合、各システムは一度ログインするためにユーザー名とパスワードを入力する必要があります。ユーザーエクスペリエンスは確実に低下します。

SSO と対話する要素は 2 つあります: 1. ユーザー、2. システム。その特徴は次のとおりです: 1 つのログイン、すべてのアクセス。 SSO はアクセス制御の一種であり、ユーザーがログインできるかどうか、つまりユーザーの身元を確認するかどうかを制御し、その他すべてのシステム認証はここで実行されます。SSO をシステム全体レベルで見ると、その核心は次の 3 つの要素です。 1. ユーザー、2. システム、3. 認証センター。

PHP での SSO シングル サインオンの実装方法の詳細な分析

1. 同じドメインで異なるサブドメインに対してシングル サインオンを実行する方法

弊社のサイトが次の場合展開されているドメイン名:

  • sub1.onmpw.com
  • sub2.onmpw.com

両方のサイトが同じドメイン onmpw.com を共有しています。

デフォルトでは、ブラウザは Cookie が属するドメインに対応するホストを送信します。つまり、sub1.onmpw.com からの Cookie のデフォルト ドメインは .sub1.onmpw.com です。したがって、sub2.onmpw.com は、sub1.onmpw.com に属する Cookie 情報を取得しません。それらは異なるホスト上にあり、サブドメインも異なるためです。

1.1 同じドメインの下に両方の Cookie 情報を設定します

  • sub1.onmpw.com システムにログインします
  • 成功したらログイン、一意の識別子トークンを生成します (トークンがわかっていれば、どのユーザーがログインしているかがわかります)。 Cookie情報を設定します。ここで注意すべき点は、TokenはCookieに格納されますが、設定する際には、このCookieが属するドメインをトップレベルドメイン.onmpw.comに設定する必要があります。ここでは setcookie 関数を使用できます。この関数の 4 番目のパラメーターは、Cookie のドメインを設定するために使用されます。
setcookie(‘token’, ’xxx’, '/', ’.onmpw.com’);复制代码
  • sub2.onmpw.com システムにアクセスすると、ブラウザはリクエストとともに Cookie 内の情報トークンを sub2.onmpw.com システムに送信します。このとき、システムはまずセッションにログインしているかどうかを確認します。ログインしていない場合は、Cookie 内のトークンを検証して自動ログインを実現します。

  • sub2.onmpw.com ログインに成功した後、セッション情報を書き込みます。今後の検証のために、独自のセッション情報を使用して検証してください。

1.2 ログアウト

ここで問題が発生します。sub1 システムがログアウトした後、自身のセッション情報と所属するドメイン .onmpw .com Cookie 情報。サブ2システムのセッション情報はクリアされません。そのsub2はまだログインしています。つまり、この方法ではシングルサインオンは実現できますが、同時ログアウトは実現できません。その理由は、sub1 と sub2 は setcookie 関数の設定を通じて Cookie を共有できますが、それらの sessionId が異なり、この sessionId もブラウザーに Cookie の形式で保存されますが、それが属するドメインが .onmpw ではないためです。 .com。

それでは、この問題をどうやって解決すればいいのでしょうか?この場合、2 つのシステムの sessionId が同じである限り、この問題は解決できることがわかります。つまり、sessionId を格納する Cookie が属するドメインも .onmpw.com になります。 PHP では、session_start() が呼び出された後に sessionId が生成されます。 sub1 と sub2 に同じ sessionId を持たせたい場合は、session_start() の前に sessionId が属するドメインを設定する必要があります:

ini_set('session.cookie_path', '/');
ini_set('session.cookie_domain', '.onmpw.com');
ini_set('session.cookie_lifetime', '0');复制代码
  • #1。上記の手順により、次のことができます。異なる第 2 レベルのドメイン名を実現する シングル サインオンとサインアウト。
  • 2. ただし、さらに簡略化することもできます。たとえば、sessionId が同じであることを確認することで、異なる第 2 レベル ドメイン名のシングル サインオンとログアウトを実現できます。
  • 参考記事: https://www.onmpw.com/tm/xwzj/network_145.html

#2. 異なるドメイン間で単一リンクを実装する方法シングル サインオン - CAS

次のステーション

  • www.onmpw1.com
  • www の間にシングル サインオンを実装する必要があるとします。 onmpw2.com
  • www.onmpw3.com

上記の解決策は機能しません。

#現在、オープン ソースの SSO ソリューションが github にあります。実装原理は、メインストリーム SSO の実装原理と似ています: https://github.com/jasny/sso

# #核となる原則:
  • 1, クライアントは異なるサブシステムにアクセスし、そのサブシステムに対応する SSO ユーザー サービス センターは同じ SessionId を使用します。
  • 2, サブシステム ブローカーとサーバーは、アタッチを介して認証リンクにバインドされています

同じルート ドメイン名がドメイン ルート ドメイン名を指定していない場合、最初の認証が必要です毎回認証サービスにジャンプする必要がありますが、ドメインを指定すると、同じルート ドメイン名のいずれかが正常に認証されていれば、その Cookie を共有できます。次回からは、ユーザー情報を直接リクエストできます。

A への最初の訪問:

PHP での SSO シングル サインオンの実装方法の詳細な分析

B への 2 回目の訪問:

PHP での SSO シングル サインオンの実装方法の詳細な分析

#2.1 ログイン状態の判定##利用者が認証センターにログインすると、利用者と認証センターとの間にセッションが確立され、これをセッションと呼びます。

グローバルセッション

。その後、ユーザーがシステム アプリケーションにアクセスするときに、すべてのアプリケーション リクエストにログインするかどうかを認証センターに確認することは不可能であり、これは非常に非効率であり、単一の Web アプリケーションでは考慮する必要がありません。 システム アプリケーションとユーザーのブラウザの間に

ローカル セッション

を確立できます。ローカル セッションは、クライアントとシステム アプリケーションのログイン ステータスを維持します。ローカル セッションはグローバル セッションに依存します。グローバル セッションが消滅し、ローカル セッションも消滅する必要があります。 ユーザーがアプリケーションにアクセスすると、まずローカル セッションが存在するかどうかが確認されます。存在する場合は、ログインしているとみなされ、確認のために認証センターに行く必要はありません。存在しない場合、

はグローバル セッションが存在するかどうかを判断するために認証センターにリダイレクトされます。

存在する場合、アプリケーションに通知され、アプリケーションとクライアントはローカル セッションを確立します。次回申請が要求されるとき、申請は認証センターに行って確認する必要はありません。

2.2 終了

ユーザーは 1 つのシステムから終了し、他のサブシステムにアクセスします。これも終了ステータスである必要があります。これを行うには、ローカルの部分セッションを終了するだけでなく、アプリケーションはユーザーが終了したことを認証センターに通知する必要もあります。

認証センターは終了通知を受信後、グローバルセッションを終了することができ、ユーザーが他のアプリケーションにアクセスするとログアウト状態が表示されます。

ローカル セッションを確立しているすべてのサブシステムに直ちに通知し、ローカル セッションを破棄する必要があるかどうかは、実際のプロジェクトに応じて決定できます。

推奨学習: 「
PHP ビデオ チュートリアル

以上がPHP での SSO シングル サインオンの実装方法の詳細な分析の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はjuejin.cnで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。