单点登录(Single Sign-On,简称SSO)是一种身份认证机制,它允许用户使用一组凭据(如用户名和密码)登录多个应用程序
。当用户已经登录一个应用程序时,他们可以无需重新输入凭据即可访问其他应用程序。以下是一个使用PHP实现SSO的示例代码: 假设有两个应用程序A和B,它们都需要使用SSO实现单点登录。我们可以使用PHP的SESSION来保存用户的登录状态,并使用COOKIE来在应用程序之间共享SESSION ID。具体实现步骤如下:
-
应用程序A的登录页面:
<?php session_start(); if ($_SERVER['REQUEST_METHOD'] == 'POST') { // 验证用户凭据 if ($_POST['username'] == 'userA' && $_POST['password'] == 'passwordA') { $_SESSION['username'] = $_POST['username']; // 生成唯一的token $token = md5(uniqid()); // 将token保存到SESSION中 $_SESSION['token'] = $token; // 将token保存到COOKIE中 setcookie('token', $token, time() + 3600, '/', 'example.com', false, true); header('Location: /appA/dashboard.php'); exit; } else { echo '用户名或密码错误'; } } ?> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>应用程序A登录</title> </head> <body> <form method="POST"> <label>用户名:</label> <input type="text" name="username"><br> <label>密码:</label> <input type="password" name="password"><br> <button type="submit">登录</button> </form> </body> </html>
-
应用程序B的登录页面:
<?php session_start(); if ($_SERVER['REQUEST_METHOD'] == 'POST') { // 验证用户凭据 if ($_POST['username'] == 'userB' && $_POST['password'] == 'passwordB') { $_SESSION['username'] = $_POST['username']; // 获取COOKIE中的token $token = $_COOKIE['token']; // 将token保存到SESSION中 $_SESSION['token'] = $token; header('Location: /appB/dashboard.php'); exit; } else { echo '用户名或密码错误'; } } ?> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>应用程序B登录</title> </head> <body> <form method="POST"> <label>用户名:</label> <input type="text" name="username"><br> <label>密码:</label> <input type="password" name="password"><br> <button type="submit">登录</button> </form> </body> </html>
-
应用程序A和B的dashboard页面:
<?php session_start(); if (!isset($_SESSION['username']) || !isset($_SESSION['token']) || !isset($_COOKIE['token']) || $_SESSION['token'] != $_COOKIE['token']) { header('Location: /login.php'); exit; } ?> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Dashboard</title> </head> <body> <h1>欢迎访问应用程序A/B的Dashboard</h1> <p>您已经登录,用户名:<?php echo $_SESSION['username']; ?></p> <a href="/logout.php">退出登录</a> </body> </html>
-
应用程序A和B的logout页面:
<?php session_start(); // 清除SESSION session_unset(); session_destroy(); // 清除COOKIE setcookie('token', '', time() - 3600, '/', 'example.com', false, true); header('Location: /login.php'); exit; ?>
总结
:在上述代码中,我们使用了SESSION来保存用户的登录状态和token,使用COOKIE来在应用程序之间共享SESSION ID和token。在访问dashboard页面时,我们需要验证用户是否已经登录,并且SESSION ID和COOKIE中保存的token是否一致,以防止CSRF攻击和伪造SESSION ID。在退出登录时,我们需要清除SESSION和COOKIE中的信息,以保证用户已经完全退出登录。 需要注意的是,上述代码仅仅是一个简单的示例,实际应用中需要根据具体情况来选择和处理SESSION和COOKIE的信息,并考虑到安全性、性能和稳定性等问题,例如SESSION过期时间、COOKIE域名和安全标志等。
版权声明:本文为weixin_44035459原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。