在PHP中实现单点登录(Single Sign-On,简称SSO)通常涉及以下几个步骤:
-
用户认证:首先,用户需要在一个认证中心进行登录,认证中心会验证用户的身份并颁发一个认证凭证(通常是令牌)。
-
令牌传递:用户在访问其他需要登录的应用时,会将认证凭证(令牌)携带在请求头中传递给这些应用。
-
令牌验证:应用接收到令牌后,会向认证中心发送请求以验证令牌的有效性。
-
用户会话:一旦令牌被验证有效,认证中心会创建或更新用户的会话信息,应用可以根据会话信息判断用户是否已经登录。
下面是一个简单的示例,使用PHP和JWT(JSON Web Token)来实现单点登录:
1. 安装JWT库
首先,你需要安装一个JWT库,例如 firebase/php-jwt
。你可以通过Composer来安装:
composer require firebase/php-jwt
2. 创建认证中心
创建一个认证中心,负责用户的登录和令牌的生成与验证。
$username, $password) {
// 这里应该连接数据库并验证用户名和密码
if ($username === 'admin' && $password === 'password') {
$token = [
'iss' => 'http://example.com',
'iat' => time(),
'exp' => time() + 3600,
'userId' => $username
];
return JWT::encode($token, $this->secretKey, 'HS256');
}
return null;
}
public function verifyToken($token) {
try {
$decoded = JWT::decode($token, new JWK([$this->secretKey]), ['HS256']);
return $decoded->userId;
} catch (Exception $e) {
return null;
}
}
}
?>
3. 创建应用
创建一个应用,负责接收令牌并验证用户身份。
$authCenter) {
$this->authCenter = $authCenter;
}
public function handleRequest($token) {
$userId = $this->authCenter->verifyToken($token);
if ($userId) {
echo "Welcome, $userId! You are logged in.";
} else {
echo "Invalid token. Please log in again.";
}
}
}
?>
4. 使用示例
创建一个简单的HTTP服务器来测试单点登录。
$username, $password) {
if ($username === 'admin' && $password === 'password') {
$token = [
'iss' => 'http://example.com',
'iat' => time(),
'exp' => time() + 3600,
'userId' => $username
];
return JWT::encode($token, $this->secretKey, 'HS256');
}
return null;
}
public function verifyToken($token) {
try {
$decoded = JWT::decode($token, new JWK([$this->secretKey]), ['HS256']);
return $decoded->userId;
} catch (Exception $e) {
return null;
}
}
}
class Application {
private $authCenter;
public function __construct(AuthCenter $authCenter) {
$this->authCenter = $authCenter;
}
public function handleRequest($token) {
$userId = $this->authCenter->verifyToken($token);
if ($userId) {
echo "Welcome, $userId! You are logged in.";
} else {
echo "Invalid token. Please log in again.";
}
}
}
$authCenter = new AuthCenter();
$application = new Application($authCenter);
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$token = $_POST['token'];
$application->handleRequest($token);
} else {
echo '
';
}
?>
5. 测试
你可以使用Postman或其他HTTP客户端工具来测试单点登录功能。首先访问认证页面,输入用户名和密码,获取令牌。然后将令牌传递给应用页面,应用会验证令牌并显示欢迎信息。
通过这种方式,你可以实现一个简单的单点登录系统。实际应用中,你可能需要添加更多的安全措施,例如HTTPS、数据库验证、密码加密等。