一套账号密码,全系统通用
采用 共享 JWT 密钥 模式:SSO 中心签发 token,各子系统用同一密钥验证。
用户 → 任一系统登录 → SSO 中心验证 → 签发 JWT
→ 子系统用共享密钥解密 → 识别用户
# 在子系统的环境变量中配置 (与 auth 服务一致) GUOBIAO_SSO_SECRET=336e41f2ade16f3e18926f2465e5571ecbcb3956aa8763091bbdfa61bed30e87 # 密钥来源: /etc/systemd/system/guobiao-auth.service
import os, jwt
from fastapi import Depends, HTTPException
from fastapi.security import HTTPBearer
security = HTTPBearer()
SSO_SECRET = os.getenv("GUOBIAO_SSO_SECRET", "")
def get_current_user(credentials=Depends(security)):
# 尝试 SSO token
try:
payload = jwt.decode(credentials.credentials, SSO_SECRET, algorithms=["HS256"])
if payload.get("iss") == "guobiao-sso":
username = payload.get("username")
user = db.query(User).filter(User.username == username).first()
if user: return user
except Exception:
pass
# 降级: 本地 JWT 验证
...
POST http://127.0.0.1:8700/sso/login
Body: {"username": "xxx", "password": "xxx"}
返回: {"data": {"access_token": "JWT...", "user": {...}}}
SSO 登录成功后, 用返回的 access_token 作为子系统 token,
子系统 get_current_user 验证通过即视为已登录 (自动创建本地用户映射).
| 系统 | 状态 | 说明 |
|---|---|---|
| HR/财务 (guobiao-platform) | ✅ 已接入 | 前端 modules.js 已集成 |
| 工作手机 (work-phone) | ✅ 已接入 | login 优先走 SSO + token 验证 |
| 郭标表单 (guobiao-form) | ✅ 已接入 | app/index.html 已集成 |
| 智慧物业 (gansu-property) | ⏳ 待接入 | Java 认证需源码级改造 (验证码+租户体系) |
| 接口 | 方法 | 说明 |
|---|---|---|
| /sso/login | POST | 登录, 返回 access_token |
| /sso/register | POST | 注册 (自动登录) |
| /sso/me | GET | 当前用户信息 (含实名状态) |
| /sso/logout | POST | 退出登录 |
1. 共享密钥必须严格保密, 泄露后可伪造任意用户 token 2. 密钥可通过 /etc/systemd/system/guobiao-auth.service 查看 3. 子系统用户表需与 SSO username 一致 (自动映射或手动创建) 4. SSO 不可用时, 子系统自动降级为本地认证 (高可用)