# 统一 SSO：认证中心 + Python 应用 + PHP 应用

这个目录演示更真实的单点登录结构：

```text
统一认证中心 http://127.0.0.1:8300
Python 业务应用 http://127.0.0.1:8310
PHP 业务应用    http://127.0.0.1:8320
```

## 启动方式

打开三个终端：

```bash
cd auth_server
python server.py
```

```bash
cd python_app
python server.py
```

```bash
cd php_app
php -S 127.0.0.1:8320 index.php
```

## 怎么看出单点登录效果

- 访问 `http://127.0.0.1:8310`，会跳到统一认证中心。
- 使用 `admin / 123456` 登录。
- Python 应用会拿到 ticket 并建立自己的本地 session。
- 再访问 `http://127.0.0.1:8320`。
- PHP 应用也会跳到统一认证中心，但认证中心已经登录，所以不会再要求输入密码，会直接签发 PHP 应用的 ticket。
- PHP 应用消费 ticket 后建立自己的本地 session。

## 核心逻辑

```text
业务应用没有 session
  -> 跳转统一认证中心 /login?app_id=xxx&redirect_uri=xxx
认证中心发现用户已登录
  -> 创建当前 app 专用的一次性 ticket
  -> 回跳业务应用 callback
业务应用调用认证中心 /validate 校验 ticket
  -> 校验成功后建立自己的本地 session
```

## 注意事项

- 认证中心必须校验 `redirect_uri` 白名单。
- ticket 必须短期有效、绑定 app、一次性使用。
- 业务应用只保存自己的 session，不保存统一登录密码。
- 真实生产环境建议使用 OAuth2/OIDC，而不是自定义协议。
