page contents

php实现SSO单点登录实例

以下内容希望帮助到大家!

attachments-2020-05-Vw82XUMM5ec23ab8a4aa1.jpg

1、点击登录跳转到SSO登录页面并带上当前应用的callback地址
2、登录成功后生成COOKIE并将COOKIE传给callback地址
3、callback地址接收SSO的COOKIE并设置在当前域下再跳回到应用1即完成登录
4、再在应用程序需要登录的地方嵌入一个iframe用来实时检测登录状态

 1 <?php
 2 //index.php 应用程序页面
 3 header('Content-Type:text/html; charset=utf-8');
 4 $sso_address      = 'http://www.c.com/sso_login.php'; //你SSO所在的域名
 5 $callback_address = 'http://' . $_SERVER['HTTP_HOST']
 6     . str_replace('index.php', '', $_SERVER['SCRIPT_NAME'])
 7     . 'callback.php'; //callback地址用于回调设置cookie
 8 
 9 if (isset($_COOKIE['sign'])) {
10     exit("欢迎您{$_COOKIE['sign']} <a href=\"login.php?logout\">退出</a>");
11 } else {
12     echo '您还未登录 <a href="' . $sso_address . '?callback=' . $callback_address . '">点此登录</a>';
13 }
14 ?>
15 <iframe src="<?php echo $sso_address ?>?callback=<?php echo $callback_address ?>" frameborder="0" width="0"
16         height="0"></iframe>
17 
18 <?php
19 //callback.php 回调页面用来设置跨域COOKIE
20 header('Content-Type:text/html; charset=utf-8');
21 if (empty($_GET)) {
22     exit('您还未登录');
23 } else {
24     foreach ($_GET as $key => $val) {
25         setcookie($key, $val, 0, '');
26     }
27     header("location:index.php");
28 }
29 ?>
30 
31 <?php
32 //connect.php 用来检测登录状态的页面,内嵌在页面的iframe中
33 header('Content-Type:text/html; charset=utf-8');
34 if (isset($_COOKIE['sign'])) {
35     $callback = urldecode($_GET['callback']);
36     unset($_GET['callback']);
37     $query    = http_build_query($_COOKIE);
38     $callback = $callback . "?{$query}";
39 } else {
40     exit;
41 }
42 ?>
43 <html>
44 <script type="text/javascript">top.location.href = "<?php echo $callback; ?>";</script>
45 </html>
46 
47 
48 <?php
49 
50 //login.php SSO登录页面
51 header('Content-Type:text/html; charset=utf-8');
52 if (isset($_GET['logout'])) {
53     setcookie('sign', '', -300);
54     unset($_GET['logout']);
55     header('location:index.php');
56 }
57 
58 if (isset($_POST['username']) && isset($_POST['password'])) {
59     setcookie('sign', $_POST['username'], 0, '');
60     header("location:" . $_POST['callback'] . "?sign={$_POST['username']}");
61 }
62 
63 if (empty($_COOKIE['sign'])) {
64     ?>
65 
66     <form method="post">
67         <p>用户名:<input type="text" name="username"/></p>
68         <p>密 码:<input type="password" name="password"/></p>
69         <input type="hidden" name="callback" value="<?php echo $_GET['callback']; ?>"/>
70         <input type="submit" value="登录"/>
71     </form>
72 
73 
74     <?php
75 } else {
76     $query = http_build_query($_COOKIE);
77     echo "系统检测到您已登录 {$_COOKIE['sign']} <a href=\"{$_GET['callback']}?{$query}\">授权</a> <a href=\"?logout\">退出</a>";
78 }


attachments-2020-05-GTyMRXdA5ec232ad7bd76.jpg

  • 发表于 2020-05-18 15:01
  • 阅读 ( 456 )
  • 分类:PHP开发

你可能感兴趣的文章

相关问题

0 条评论

请先 登录 后评论
Pack
Pack

1135 篇文章

作家榜 »

  1. 轩辕小不懂 2403 文章
  2. 小柒 1316 文章
  3. Pack 1135 文章
  4. Nen 576 文章
  5. 王昭君 209 文章
  6. 文双 71 文章
  7. 小威 64 文章
  8. Cara 36 文章