# 单点登录 SSO 示例：Python 版与 PHP 版

这个目录包含两个本地可运行的单点登录示例：

- `python_sso/server.py`：Python 标准库版本。
- `php_sso/index.php`：PHP 内置服务器版本。

两套示例都模拟了认证中心和业务应用，重点演示 SSO 的核心流程：登录拦截、跳转认证中心、一次性 ticket 回跳、业务应用建立本地会话、退出登录。

## Python 运行方式

```bash
cd python_sso
python server.py
```

访问：

```text
http://127.0.0.1:8100
```

指定端口：

```powershell
$env:PORT=8110; python server.py
```

## PHP 运行方式

```bash
cd php_sso
php -S 127.0.0.1:8200 index.php
```

访问：

```text
http://127.0.0.1:8200
```

## 实现了哪些功能

- 认证中心登录，账号 `admin`，密码 `123456`。
- 业务应用登录拦截，未登录时跳转到认证中心。
- 认证中心登录成功后签发一次性 ticket。
- 业务应用通过 callback 消费 ticket，并写入自己的本地 session Cookie。
- 已登录用户再次访问业务应用时不需要重复输入账号密码。
- 支持退出登录，清理认证中心和业务应用 Cookie。
- 页面展示功能、实现方式、主要代码段、整体逻辑和注意事项。

## 核心逻辑

```text
用户访问业务应用 /app
业务应用检查 app_session
没有 app_session -> 跳转 /sso/login?redirect_uri=/app/callback
认证中心校验账号密码
认证中心写入 sso_session
认证中心生成一次性 ticket
浏览器跳回 /app/callback?ticket=xxx
业务应用消费 ticket
业务应用写入 app_session
用户进入业务页面
```

## 注意事项

- 示例用于理解 SSO 核心流程，不是生产级认证系统。
- 生产环境必须校验 `redirect_uri` 白名单，避免开放重定向漏洞。
- ticket 必须短期有效、一次性使用，并存储在可靠的集中存储中。
- Cookie 应开启 `HttpOnly`、`Secure`、`SameSite`，并结合 HTTPS 使用。
- 真实业务建议使用 OAuth2/OIDC、CAS 或 SAML，不建议自研完整认证协议。
