ホームページ  >  記事  >  バックエンド開発  >  PHP プログラミング SSO の詳細な紹介と例

PHP プログラミング SSO の詳細な紹介と例

墨辰丷
墨辰丷オリジナル
2018-05-26 15:27:421571ブラウズ

この記事では、主に PHP プログラミング SSO の詳細な紹介と、簡単な例の関連情報を紹介します。ここでは、クロスサブドメイン シングル サインイン、完全クロスシングル ポイント ドメイン サインイン、およびステーション グループ共有 ID の 3 つのモードを紹介します。次の

PHP SSOの詳細説明

SSOには、①クロスサブドメインシングルポイントログイン②完全クロスシングルポイントドメインログイン③ステーショングループ共有ID認証

の3つのモードがあります。最初のモードは非常にシンプルで、必要なのは Cookie ドメインを複数のアプリケーションのルート ドメインに設定するだけです

2 番目の方法も非常にシンプルで、すべてのアプリケーションの認証アドレスを同じ認証アドレスに変更し、チェックすることです。毎回認証センターにログインするかどうかは、ログイン後、呼び出し元のアプリケーションに暗号化されたトークンを発行するだけです

3 番目のタイプのクロスドメインは、トークンを確認するために前後に移動することですが、これは少し面倒です。

ディレクトリ構造を構成します

サーバーのルート ディレクトリに、3 つの新しいプロジェクト ディレクトリを作成します。プロジェクト ディレクトリ:

|–/website root directory/
|–|–/oa/
|–|–/bbs/
| –|–/blog/

ルート ディレクトリに新しい function.PHP スクリプト ファイルを作成します。具体的には、内容は次のとおりです。

<?php

/**
 * 获取登陆token
 * @param string $url 获取token的地址
 * 2017-01-03T13:08:43+0800
 */
function getToken($url)
{
  $bool = isLogin();
  if ($bool) {
    // 如果登陆了跳转到本站首页
    header(&#39;location: index.php&#39;);
    exit();
  }

  // 否则没有登陆,去另一个站点看是否登陆
  header(&#39;location: &#39;.$url);
}

// 校验令牌是否正确
function yzToken($domain)
{
  $url = isset($_GET[&#39;url&#39;]) ? $_GET[&#39;url&#39;] : &#39;&#39;;
  $username = isset($_GET[&#39;username&#39;]) ? $_GET[&#39;username&#39;] : &#39;&#39;;
  $token = isset($_GET[&#39;token&#39;]) ? $_GET[&#39;token&#39;] : &#39;&#39;;


  if (!empty($username) && !empty($token)) {
    $salt = &#39;taoip&#39;;
    $_token = md5($salt.$username);
    // 校验第三方站点过来时的token是否正确
    if ($_token == $token) {
      // 设置跳转过来的网站的Cookie
      setCook($username, $_token, $domain);
      header(&#39;location: index.php&#39;);
    }
  }

}

// 设置cookie
function setCook($username, $_password, $domain)
{
  // 校验成功,开始登陆
  setcookie(&#39;username&#39;, $username, time()+3600, &#39;/&#39;, $domain);
  setcookie(&#39;token&#39;, $_password, time()+3600, &#39;/&#39;, $domain);
  header(&#39;location: index.php&#39;);
}

// 判断是否登陆
function isLogin()
{
  $username = isset($_COOKIE[&#39;username&#39;]) ? $_COOKIE[&#39;username&#39;] : &#39;&#39;;
  $token = isset($_COOKIE[&#39;token&#39;]) ? $_COOKIE[&#39;token&#39;] : &#39;&#39;;
  $salt = &#39;taoip&#39;;

  $_token = md5($salt.$username);

  if ($token == $_token) {
    return true;
  } else {
    return false;
  }
}

?>

oa プロジェクト ディレクトリに、index.php と 2 つのスクリプト ファイルを作成します。 login.php

index.phpファイルを編集します

<?php

// OA站点

// (1)开启Session会话
session_name(&#39;taoip&#39;);
session_start();
// (2)获取用户名和token进行校验
$username = isset($_COOKIE[&#39;username&#39;]) ? $_COOKIE[&#39;username&#39;] : &#39;&#39;;
$token = isset($_COOKIE[&#39;token&#39;]) ? $_COOKIE[&#39;token&#39;] : &#39;&#39;;

$salt = &#39;taoip&#39;;

$_token = md5($salt.$username);

if ($token != $_token) {
  header(&#39;location: login.php&#39;);
  exit();
}

echo "欢迎{$username}用户,访问OA站点";

?>

login.phpファイルを編集します

<?php

// OA站点登陆系统
require &#39;../functions.php&#39;;

// (2)验证
yzToken(&#39;taoip.cn&#39;);

// (1)判断是否登陆,登陆则跳转首页,未登录则去其他站点获取token
$url = isset($_GET[&#39;url&#39;]) ? $_GET[&#39;url&#39;] : &#39;&#39;;
if (empty($url)) {
  getToken(&#39;http://dengpeng.cc/login.php?url=http://oa.taoip.cn/login.php&#39;);
}

// (1)判断用户是否登陆
$bool = isLogin();
$url = isset($_GET[&#39;url&#39;]) ? $_GET[&#39;url&#39;] : &#39;&#39;;
if ($bool) {
  if (empty($url)) {
    header(&#39;location: index.php&#39;);
  } else {
    $username = isset($_COOKIE[&#39;username&#39;]) ? $_COOKIE[&#39;username&#39;] : &#39;&#39;;
    $token = isset($_COOKIE[&#39;token&#39;]) ? $_COOKIE[&#39;token&#39;] : &#39;&#39;;
    $lurl = $url.&#39;?username=&#39;.$username.&#39;&token=&#39;.$token;
    header(&#39;location: &#39;.$lurl);
  }
}


if (!empty($_POST)) {
  $username = isset($_POST[&#39;username&#39;]) ? $_POST[&#39;username&#39;] : &#39;&#39;;
  $password = isset($_POST[&#39;password&#39;]) ? $_POST[&#39;password&#39;] : &#39;&#39;;

  // 从库中查询用户密码
  @$link = mysql_connect(&#39;localhost&#39;, &#39;root&#39;, &#39;&#39;);
  mysql_query(&#39;use sso&#39;, $link);
  mysql_query(&#39;set names utf8&#39;, $link);
  $sql = "select * from users where username = &#39;".$username."&#39;";
  $user = mysql_fetch_assoc(mysql_query($sql, $link));

  // 校验
  $salt = &#39;taoip&#39;;
  $_password = md5($salt.$username);

  // var_dump($user[&#39;password&#39;] == $_password);
  // print_r($user);exit();

  if ($user[&#39;password&#39;] == $_password) {
    // 校验成功,开始登陆
    setcookie(&#39;username&#39;, $username, time()+3600, &#39;/&#39;, &#39;taoip.cn&#39;);
    setcookie(&#39;token&#39;, $_password, time()+3600, &#39;/&#39;, &#39;taoip.cn&#39;);
    // 如果URL没有值重定向到首页,否则重定向到URL页面
    if (empty($url)) {
      header(&#39;location: index.php&#39;);
    } else {
      header(&#39;location: &#39;.$lurl);
    }
  }
}

?>

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="generator" content="Sublime Text 3114">
  <meta name="author" content="3@dengpeng.cc">
  <meta name="keywords" content="">
  <meta name="description" content="">
  <title>OA站点登陆系统</title>
</head>
<body>
  <p class="container">
    <h2>oa.taoip.cn站点登陆系统</h2>
    <form action="" method="post">
      <label for="">用户名</label>
      <input type="text" name="username">
      <br>
      <label for="">密码</label>
      <input type="text" name="password">
      <hr>
      <button type="submit">提交</button>
    </form>
  </p>
</body>
</html>

bbsプロジェクトディレクトリに、index.phpとlogin.php

という2つのスクリプトファイルを作成します

index.php ファイルを編集します

<?php
/**
 * @author DengPeng <3@dengpeng.cc>
 * @since 2017/01/03
 * @copyright copyright (c) 2017 zixue.it GPL
 * @license http://www.zixue.it/
 */

// BBS站点

// (1)开启Session会话
session_name(&#39;taoip&#39;);
session_start();
// (2)获取用户名和token进行校验
$username = isset($_COOKIE[&#39;username&#39;]) ? $_COOKIE[&#39;username&#39;] : &#39;&#39;;
$token = isset($_COOKIE[&#39;token&#39;]) ? $_COOKIE[&#39;token&#39;] : &#39;&#39;;

$salt = &#39;taoip&#39;;

$_token = md5($salt.$username);

if ($token != $_token) {
  header(&#39;location: login.php&#39;);
  exit();
}

echo "欢迎{$username}用户,访问BBS站点";

?>

login.php ファイルを編集します

<?php
/**
 * @author DengPeng <3@dengpeng.cc>
 * @since 2017/01/03
 * @copyright copyright (c) 2017 zixue.it GPL
 * @license http://www.zixue.it/
 */

// BBS站点登陆系统
require &#39;../functions.php&#39;;

// (2)验证
yzToken(&#39;taoip.cn&#39;);

// (1)判断是否登陆,登陆则跳转首页,未登录则去其他站点获取token
$url = isset($_GET[&#39;url&#39;]) ? $_GET[&#39;url&#39;] : &#39;&#39;;
if (empty($url)) {
  getToken(&#39;http://dengpeng.cc/login.php?url=http://bbs.taoip.cn/login.php&#39;);
}

// (1)判断用户是否登陆
$bool = isLogin();
$url = isset($_GET[&#39;url&#39;]) ? $_GET[&#39;url&#39;] : &#39;&#39;;
if ($bool) {
  if (empty($url)) {
    header(&#39;location: index.php&#39;);
  } else {
    $username = isset($_COOKIE[&#39;username&#39;]) ? $_COOKIE[&#39;username&#39;] : &#39;&#39;;
    $token = isset($_COOKIE[&#39;token&#39;]) ? $_COOKIE[&#39;token&#39;] : &#39;&#39;;
    $lurl = $url.&#39;?username=&#39;.$username.&#39;&token=&#39;.$token;
    header(&#39;location: &#39;.$lurl);
  }
}


if (!empty($_POST)) {
  $username = isset($_POST[&#39;username&#39;]) ? $_POST[&#39;username&#39;] : &#39;&#39;;
  $password = isset($_POST[&#39;password&#39;]) ? $_POST[&#39;password&#39;] : &#39;&#39;;

  // 从库中查询用户密码
  @$link = mysql_connect(&#39;localhost&#39;, &#39;root&#39;, &#39;&#39;);
  mysql_query(&#39;use sso&#39;, $link);
  mysql_query(&#39;set names utf8&#39;, $link);
  $sql = "select * from users where username = &#39;".$username."&#39;";
  $user = mysql_fetch_assoc(mysql_query($sql, $link));

  // 校验
  $salt = &#39;taoip&#39;;
  $_password = md5($salt.$username);

  // var_dump($user[&#39;password&#39;] == $_password);
  // print_r($user);exit();

  if ($user[&#39;password&#39;] == $_password) {
    // 校验成功,开始登陆
    setcookie(&#39;username&#39;, $username, time()+3600, &#39;/&#39;, &#39;taoip.cn&#39;);
    setcookie(&#39;token&#39;, $_password, time()+3600, &#39;/&#39;, &#39;taoip.cn&#39;);
    // 如果URL没有值重定向到首页,否则重定向到URL页面
    if (empty($url)) {
      header(&#39;location: index.php&#39;);
    } else {
      header(&#39;location: &#39;.$lurl);
    }
  }
}

?>

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="generator" content="Sublime Text 3114">
  <meta name="author" content="3@dengpeng.cc">
  <meta name="keywords" content="">
  <meta name="description" content="">
  <title>BBS站点登陆系统</title>
</head>
<body>
  <p class="container">
    <h2>bbs.taoip.cn站点登陆系统</h2>
    <form action="" method="post">
      <label for="">用户名</label>
      <input type="text" name="username">
      <br>
      <label for="">密码</label>
      <input type="text" name="password">
      <hr>
      <button type="submit">提交</button>
    </form>
  </p>
</body>
</html>

プロジェクト ディレクトリに、index.php とlogin.php という 2 つのスクリプト ファイルを作成します

Index.php ファイル

<?php
/**
 * @author DengPeng <3@dengpeng.cc>
 * @since 2017/01/03
 * @copyright copyright (c) 2017 zixue.it GPL
 * @license http://www.zixue.it/
 */

// blog站点

// (1)开启Session会话
session_name(&#39;taoip&#39;);
session_start();
// (2)获取用户名和token进行校验
$username = isset($_COOKIE[&#39;username&#39;]) ? $_COOKIE[&#39;username&#39;] : &#39;&#39;;
$token = isset($_COOKIE[&#39;token&#39;]) ? $_COOKIE[&#39;token&#39;] : &#39;&#39;;

$salt = &#39;taoip&#39;;

$_token = md5($salt.$username);

if ($token != $_token) {
  header(&#39;location: login.php&#39;);
  exit();
}

echo "欢迎{$username}用户,访问blog站点";

?>

<?php
/**
 * @author DengPeng <3@dengpeng.cc>
 * @since 2017/01/03
 * @copyright copyright (c) 2017 zixue.it GPL
 * @license http://www.zixue.it/
 */

// blog站点

// (1)开启Session会话
session_name(&#39;taoip&#39;);
session_start();
// (2)获取用户名和token进行校验
$username = isset($_COOKIE[&#39;username&#39;]) ? $_COOKIE[&#39;username&#39;] : &#39;&#39;;
$token = isset($_COOKIE[&#39;token&#39;]) ? $_COOKIE[&#39;token&#39;] : &#39;&#39;;

$salt = &#39;taoip&#39;;

$_token = md5($salt.$username);

if ($token != $_token) {
  header(&#39;location: login.php&#39;);
  exit();
}

echo "欢迎{$username}用户,访问blog站点";

?>

login.php ファイルを編集します

<?php
/**
 * @author DengPeng <3@dengpeng.cc>
 * @since 2017/01/03
 * @copyright copyright (c) 2017 zixue.it GPL
 * @license http://www.zixue.it/
 */

// blog站点登陆系统
require &#39;../functions.php&#39;;

// (2)验证
yzToken(&#39;dengpeng.cc&#39;);

// (1)判断是否登陆,登陆则跳转首页,未登录则去其他站点获取token
$url = isset($_GET[&#39;url&#39;]) ? $_GET[&#39;url&#39;] : &#39;&#39;;
if (empty($url)) {
  getToken(&#39;http://oa.taoip.cn/login.php?url=http://dengpeng.cc/login.php&#39;);
}


// (1)判断用户是否登陆
$bool = isLogin();
$url = isset($_GET[&#39;url&#39;]) ? $_GET[&#39;url&#39;] : &#39;&#39;;
if ($bool) {
  if (empty($url)) {
    header(&#39;location: index.php&#39;);
  } else {
    $username = isset($_COOKIE[&#39;username&#39;]) ? $_COOKIE[&#39;username&#39;] : &#39;&#39;;
    $token = isset($_COOKIE[&#39;token&#39;]) ? $_COOKIE[&#39;token&#39;] : &#39;&#39;;
    $lurl = $url.&#39;?username=&#39;.$username.&#39;&token=&#39;.$token;
    header(&#39;location: &#39;.$lurl);
  }
}


// (3)判断用户是否提交数据
if (!empty($_POST)) {
  $username = isset($_POST[&#39;username&#39;]) ? $_POST[&#39;username&#39;] : &#39;&#39;;
  $password = isset($_POST[&#39;password&#39;]) ? $_POST[&#39;password&#39;] : &#39;&#39;;

  // 从库中查询用户密码
  @$link = mysql_connect(&#39;localhost&#39;, &#39;root&#39;, &#39;&#39;);
  mysql_query(&#39;use sso&#39;, $link);
  mysql_query(&#39;set names utf8&#39;, $link);
  $sql = "select * from users where username = &#39;".$username."&#39;";
  $user = mysql_fetch_assoc(mysql_query($sql, $link));

  // 校验
  $salt = &#39;taoip&#39;;
  $_password = md5($salt.$username);

  // var_dump($user[&#39;password&#39;] == $_password);
  // print_r($user);exit();

  if ($user[&#39;password&#39;] == $_password) {
    setCook($username, $_password, &#39;dengpeng.cc&#39;);
    if (empty($url)) {
      header(&#39;location: index.php&#39;);
    } else {
      header(&#39;location: &#39;.$lurl);
    }
  }
}

?>

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="generator" content="Sublime Text 3114">
  <meta name="author" content="3@dengpeng.cc">
  <meta name="keywords" content="">
  <meta name="description" content="">
  <title>blog站点登陆系统</title>
</head>
<body>
  <p class="container">
    <h2>dengpeng.cc站点登陆系统</h2>
    <form action="" method="post">
      <label for="">用户名</label>
      <input type="text" name="username">
      <br>
      <label for="">密码</label>
      <input type="text" name="password">
      <hr>
      <button type="submit">提交</button>
    </form>
  </p>
</body>
</html>

ローカル仮想ホストを構成します

具体的な構成手順については誰もがよく知っているはずなので、ここでは説明しません1 つずつ詳細に説明する必要があります。必要なのは、私が提供したリファレンスに従って、さまざまなドメイン名に対応するディレクトリを設定してマッピングするだけです。

ドメイン名/プロジェクト ディレクトリ/
oa.taoip。 taoip.cn /bbs/
dengpeng.cc /blog/

おめでとうございます。簡単な SSO システムが完成しました

設定が完了したら、忘れずに Web サーバーを再起動してください。その後は、これら 3 つの異なるサイトにアクセスするだけです。を使用して 1 つのサイトにログインでき、他のサイトからはログイン リクエストが送信されなくなります。

以上がこの記事の全内容です。皆様の学習に役立つことを願っています。


関連推奨事項:

PHP シングル サインオン SSO 実装方法

SSO シングル サインオンの原理を説明する例

php は 2 つのユーザー定義のキー名比較関数 array_udiff_ua を使用しますc()

以上がPHP プログラミング SSO の詳細な紹介と例の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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