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 路径依赖) |
| organizationIds | string | 否 | 由 SSO 服务授权追加加入的 EasyAI 组织 ID 数组,单个组织也使用数组 |
| string | 否 | 邮箱 | |
| mobile | string | 否 | 手机号 |
| avatar | string | 否 | 头像 |
| nickname | string | 否 | 昵称 |
| balance | number | 否 | 初始余额展示信息 |
返回示例:
5.1 登录时自动加入组织(可选)
管理员在 组织管理 → 编辑 弹窗中查看并复制只读的 组织 ID,由客户身份服务维护用户与组织的对应关系,在上述用户信息响应中返回 organizationIds。
使用 EasyAI 已存在组织的 _id,与 tenantId、组织名称及外部部门 ID 不同,不会自动创建组织。POST /auth/sso/login 仍然只传 accessToken,浏览器提交的组织字段不作为入组依据;客户 SSO 身份服务须确认用户有权加入所返回的组织。
| 场景 | 处理规则 |
|---|---|
| 新用户返回有效组织 | 创建账号时加入有效组织,不额外加入默认注册组织 |
| 老用户返回有效组织 | 追加加入并去重,保留原有组织,不提升系统角色或组织管理员身份 |
| 部分 ID 格式错误或组织不存在 | 跳过错误项,有效项正常入组,不影响登录 |
| 未传、空数组、非数组或全部无效 | 新用户依次回退到 SSO 默认注册组织、普通默认注册组织,均未配置则无组织;老用户组织不变 |
| 指定组织查询失败或老用户附加入组失败 | 记录服务端日志并继续原登录流程;查询失败时按未指定组织处理,附加入组失败时在下次实际 SSO 登录重试 |
数组内只接受字符串 ID,会去除首尾空格、规范化 ObjectId 并去重。空数组不会退出组织;管理员移除成员后,若后续 SSO 登录仍返回该组织,用户会被重新加入。
组织变更在下一次实际调用 SSO 登录接口时生效,不实时同步或强制刷新已有前端登录态。Token 无效、身份信息缺失、账号禁用及账号创建失败等原有登录失败条件仍然有效。
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 集成依赖字段 |
| 组织字段(可选) | organizationIds | EasyAI 组织 ID 数组,由 SSO 身份服务授权追加加入 |
7. 完成标准
POST /auth/sso/login在真实 Token 下可稳定成功sso_id与第三方id一致且稳定- token 刷新链路可用,登录态可持续
- 启用组织入组时,核验新老用户的组织成员列表、重复登录去重、无效 ID 跳过及未指定有效组织时的默认规则
Canvas CLI 服务端接入
Portal 智能体需要通过用户 SSO token 操作画布时,使用 Canvas CLI 的 SSO 接入。该文档通过时序图说明凭证兑换、传给 CLI、刷新和注销,并提供无需 EasyAI 后端源码的完整调用示例。