ホームページ >バックエンド開発 >PHPの問題 >PHP はユーザーのシングル サインオンを実装します

PHP はユーザーのシングル サインオンを実装します

WBOY
WBOYオリジナル
2023-05-06 14:59:081390ブラウズ

インターネットの発展に伴い、ユーザーのログイン機能を使用する Web サイトやアプリケーションが増えています。その中でも重要な実装方法の 1 つがユーザーのシングル サインオン (シングル サインオン、SSO と呼ばれます) です。この方法を使用すると、ユーザーは 1 つのサイトまたはアプリケーションにログインするだけで、そのサイトまたはアプリケーションに関連する他の複数のサイトまたはアプリケーションに同時にアクセスできるため、ユーザーの使用が大幅に容易になります。

この記事では、ユーザー シングル サインオンとは何か、および PHP コードを使用してこれを実装する方法について説明します。

ユーザー シングル サインオンの定義

ユーザー シングル サインオン (SSO) は、ユーザーが 1 回のログインで複数の関連サイトまたはアプリケーションにアクセスできるようにするユーザー認証方法です。従来のログイン方法では、ユーザーは Web サイトまたはアプリケーションごとに個別にログインする必要があり、通常はユーザー名とパスワードの入力が必要になります。一方、シングル サインオンでは、複数のサイトまたはアプリケーション間でログイン情報を共有できるため、ユーザーが 1 つのサイトまたはアプリケーションから別のサイトまたはアプリケーションに移動するときにログイン情報を入力する必要がなくなります。

シングル サインオンにより、ユーザー エクスペリエンスが大幅に向上し、すべての Web サイトやアプリケーションで同じログイン資格情報を入力するという面倒なプロセスからユーザーが解放されます。また、特に強力なパスワードを使用する場合、セキュリティも向上します。これにより、ユーザーが脆弱なパスワードや同じパスワードを使用することによるリスクを回避できます。

PHP によるユーザー シングル サインオンの実装

次に、簡単な例を使用して、PHP を使用してユーザー シングル サインオン機能を実装する方法を示します。 a.example.com と b.example.com という 2 つの Web サイトまたはアプリケーションがあるシナリオを考えてみましょう。ユーザーが a.example.com にアクセスした後、再ログインすることなく b.example.com にアクセスできるようにしたいと考えています。

この目標を達成するために、次の側面から始めます:

1. セッション データの共有

PHP では、$_SESSION# を使用できます。 ## ユーザー関連のセッション情報を保存する変数。ユーザーがサイト a.example.com にログインすると、ユーザーの認証情報 (ユーザー名やパスワードなど) だけでなく、ユーザーがアクセスできるページなどの他のセッション データも a.example.com に保存できます。アクセス、その他の権限など。

ユーザーが再ログインせずに b.example.com にアクセスするには、a.example.com から取得したセッション データを共有する必要があります。これを実現するには、両方のサイトの

php.ini ファイルで session.cookie_domain をメイン ドメイン名 (つまり example.com) として設定する必要があります。このようにすると、両方のサイトで使用されるセッション ID が同じになります。同時に、両方のサイトで MySQL や Redis などの同じセッション ストレージ メカニズムを使用する必要もあります。

2. クロスサイト リダイレクト

ユーザーをサイト a.example.com から b.example.com に転送するには、

header 関数を使用する必要があります。 PHP でクロスサイトリダイレクトを実行します。

a.example.com でログインした後、b.example.com にジャンプします。ユーザーがログイン認証情報を入力せずに b.example.com にアクセスできるようにするには、URL パラメータを使用してセッション ID を b.example.com に渡し、b.example.com がユーザーに関連する情報を取得できるようにする必要があります。セッション ID を通じて、関連するセッション データ。

具体的には、現在のユーザーのセッション ID を取得し、URL パラメーターとして b.example.com に渡すことができます。コードは次のとおりです:

session_start();

$session_id = session_id();

$url = "https://b.example.com/login.php?session_id=" . $session_id;

header("Location: $url");
このコードは、ユーザーのダイレクトをリセットします。 b.example.com の login.php ページにアクセスし、URL パラメータでセッション ID を渡します。

b.example.com の

login.php ページでは、URL パラメータのセッション ID を確認し、そのセッション ID を使用してユーザーに関連するセッション データを取得する必要があります。 。関連するデータが取得された場合、ユーザーはログイン済みとしてマークされます。コードは次のとおりです:

session_id($_GET['session_id']);
session_start();

// 检查该 Session ID 是否存在对应用户的 Session 数据
if (isset($_SESSION['user_id'])) {
    $_SESSION['logged_in'] = true;
    // 标识用户已经登录
}
3. クロスサイト ログアウト

クロスサイト ログインに加えて、クロスサイト ログアウトも考慮する必要があります。クロスサイト ログアウトには通常、次の手順が含まれます。

    ユーザーはサイト a.example.com からログアウトします。
  1. a.example.com のセッション データを削除します。
  2. ログアウト通知を他のサイトに送信します。
  3. 他のサイトにあるこのユーザーに関連するセッション データを削除します。
ステップ 2 では、

session_destroy() 関数を呼び出して、現在のユーザーに関連するすべてのセッション データを削除するだけで済みます。これにより、ユーザーは現在のサイトからログアウトされます。 。

ステップ 3 では、PHP の cURL 関数を使用して、他のサイトにログアウト リクエストを送信できます。たとえば、ログアウトしたユーザーの ID などの情報を含む POST リクエストを b.example.com に送信できます。コードは次のとおりです。

$user_id = 123;

$request_url = "https://b.example.com/logout.php";

$ch = curl_init($request_url);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, array('user_id' => $user_id));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

$result = curl_exec($ch);
curl_close($ch);
ステップ 4 では、前と同様に各サイトのセッション データを削除するための同様のコードを実装する必要があります。たとえば、b.example.com では、次のコードを記述して、現在のユーザーに関連するセッション データを削除できます。

session_start();
session_destroy();

4. 跨站点会话劫持

由于跨站点登录的特殊性,它会导致被恶意利用以进行跨站点会话劫持。攻击者可以通过某种方式获得受害者生成的 Session ID,然后将该 Session ID 用于攻击者自己的会话中,以此来获取受害者的权限。

为了防止这种情况的发生,我们可以使用以下几种方式来提高安全性:

  • 使用 HTTPS 进行数据加密,从而确保传输过程中敏感信息不被窃取。
  • 保持服务器端的 PHP 版本更新和安全补丁安装,以防止被已知的攻击利用。
  • 使用 session_regenerate_id() 函数定期更新 Session ID,从而减小攻击者获取当前会话 ID 的可能性。

结论

在本文中,我们介绍了用户单点登录(SSO)的含义和意义,并使用 PHP 代码演示了如何实现基本的 SSO 方案。通过单点登录,可以提高用户在网站或应用程序间的使用体验,同时也能够提高安全性。而为了确保安全性,我们还需要在保证使用方便的基础上,考虑到跨站点会话劫持等安全风险,采取相应的安全措施。相信本文对于正在考虑或正在使用用户单点登录的 PHP 开发人员来说,会有所帮助。

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

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。