SSO单点登录对接
第三方系统通过SSO接入Easyai Server的登录流程与契约
1. 目标
第三方系统通过 SSO Token 与 Easyai Server 建立统一登录,最终拿到 Easyai Server 自身签发的登录态(token/refresh_token)。
2. 参与方
Client:前端或业务调用方Easyai Server:登录网关与业务服务SSO Provider:第三方身份提供方
3. 时序图

4. Easyai Server 登录接口
4.1 接口定义
- Method:
POST - Path:
/auth/sso/login - Content-Type:
application/json
请求体:
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
| accessToken | string | 是 | SSO Provider 签发的访问令牌 |
请求示例:
4.2 标准响应结构
| 字段 | 类型 | 含义 |
|---|---|---|
| status | string | 调用结果:success / failed |
| message | string | 错误或成功描述 |
| data | object | null | 成功时返回登录信息 |
data 常见字段:
| 字段 | 类型 | 含义 |
|---|---|---|
| token | string | Easyai Server 访问令牌 |
| refresh_token | string | Easyai Server 刷新令牌 |
| sso_id | string | 第三方用户主标识(映射自 SSO id) |
| tenantId | string | null | 租户标识(Portal 判定关键字段) |
| role | string | 本系统角色 |
| balance | number | 当前余额(可选) |
成功响应示例:
失败语义:
- 缺少
accessToken:认证失败 accessToken无效/过期:认证失败- SSO 返回主键缺失(
id为空):登录失败
5. SSO Provider 接口契约
Easyai Server 将调用:
- Method:
GET - URL:
${SSO_API_URL} - Query:
access_token=<accessToken>
返回字段要求:
| 字段 | 类型 | 必填 | 含义 |
|---|---|---|---|
| id | string | 是 | 用户唯一主键,映射 sso_id |
| username | string | 是 | 用户账号 |
| permissions | string | 否 | 参与角色映射 |
| tenantId | string | null | 否 | 租户信息(Portal 路径依赖) |
| string | 否 | 邮箱 | |
| mobile | string | 否 | 手机号 |
| avatar | string | 否 | 头像 |
| nickname | string | 否 | 昵称 |
| balance | number | 否 | 初始余额展示信息 |
返回示例:
6. 环境变量与配置表单
6.1 环境变量
| 变量名 | 必填 | 示例 | 说明 |
|---|---|---|---|
| SSO_API_URL | 是 | http://localhost:5001/auth/user | SSO 用户信息接口地址 |
6.1.1 配置位置
Docker 部署场景下,请在 docker-compose.yml 的 easyai-server 服务 environment 中配置 SSO_API_URL。
示例(docker-compose):
示例:
6.2 对接表单(建议双方确认)
| 项目 | 示例 | 说明 |
|---|---|---|
| SSO 地址 | http://sso.xxx.com/auth/user | 映射 SSO_API_URL |
| Token 传递方式 | query access_token | 当前协议约定 |
| 用户主键字段 | id | 必须全局稳定唯一 |
| 权限字段 | permissions | 用于角色映射 |
| 租户字段 | tenantId | Portal 集成依赖字段 |
7. 完成标准
POST /auth/sso/login在真实 Token 下可稳定成功sso_id与第三方id一致且稳定- token 刷新链路可用,登录态可持续