Logto SSO 配置
通过 Logto Management API 进行 OIDC 身份认证系统的应用管理、角色权限分配和社交连接器配置。
概述
Logto 是团队使用的自托管 OIDC 身份认证平台,部署在 https://logto.dr.restry.cn。giraffe Bot 通过 Logto Management API 完成了大量应用配置、权限管理和问题排查工作。
Logto 实例信息
| 属性 | 值 |
|---|
| Endpoint | https://logto.dr.restry.cn |
| JWKS | https://logto.dr.restry.cn/oidc/jwks |
| Token 签名算法 | ES384 |
| ID Token 签名 | ES384 |
应用清单(10 个)
| 应用 | 类型 | App ID | 说明 |
|---|
| Clawline Client Web | SPA | j760nuoz0h3jr5g9ysogi | Web 聊天客户端 |
| Clawline Gateway Web | SPA | anbr9zjc6bgd8099ecnx3 | 管理台前端(原 Clawline Gateway,已改名) |
| Agentic BI | SPA | a749dyaep3vsnv6pdu0jx | 多 Agent BI 助手 POC |
| Agent Portal | SPA | wqzrwjesyo5medejdnfu6 | 研究项目管理平台 |
| ClawCraft | SPA | 8bbiayv3m7sg8uetkbu5h | OpenClaw RTS 风格配置面板 |
| MediaCenter Nextjs | Traditional | — | — |
| sage-next | Traditional | — | sage portal with nextjs |
| MediaCenter APP | Native | — | 手机端应用 |
| Wechat Message Service | M2M | — | — |
| Sage Portal | SPA | — | — |
API 资源
| 资源名称 | Indicator | 说明 |
|---|
| Gateway API | http://localhost:8888/ | 旧版网关(已有) |
| Core API | http://localhost:8002/ | 核心接口(已有) |
| Clawline Gateway API | https://gateway.clawlines.net/api | 新建的 Gateway 资源 |
关键概念:M2M 应用 vs API 资源
| M2M 应用 | API 资源 |
|---|
| 角色 | 客户端 / 调用方 | 服务端 / 被调用方 |
| 行为 | 拿 AppID + Secret 换 Token | 被动校验 Token |
| 特征 | 有凭证,无 indicator | 有 indicator,定义 Scope |
角色与权限
| 角色 | 类型 | 权限 |
|---|
| Sage Gateway Users | User | read:products (Core API) + read:gateway (Gateway API) |
| Gateway API Access Role | M2M | read:gateway (Gateway API) |
| Clawline Admin | User | admin (Clawline Gateway API) |
测试账号
- 用户名:
test_all_apps
- 密码:
Password123!
- 角色: Sage Gateway Users + Clawline Admin
Microsoft 社交连接器
| 属性 | 值 |
|---|
| Connector ID | 0isvikfq9d4lz1a3mog57 |
| Client ID | 13f24dae-998e-428d-aceb-10684ceaa645 |
| Tenant ID | 0a95288c-f914-44cc-99a7-9f29d237db2e |
| Cloud Instance | https://login.microsoftonline.com |
| Prompts | login(原为 none,导致 AADSTS50058 错误) |
修复记录
- 问题:
prompt=none 导致静默登录失败(AADSTS50058),浏览器无微软登录 Cookie 时直接报错
- 修复: 将 Prompts 从
none 改为 login,强制弹出登录框
- Azure 回调地址:
https://logto.dr.restry.cn/callback/azuread-universal
开发环境回调地址
| 项目 | 开发 URL |
|---|
| ClawCraft | https://craft.dev.dora.restry.cn/callback |
| Agent Portal | https://portal.dev.dora.restry.cn/callback |
| Agentic BI | https://bi.dev.dora.restry.cn/callback |
| Gateway | https://gw.dev.dora.restry.cn/callback |
| Client Web | https://web.dev.dora.restry.cn/callback |
前端接入要点
SPA 前端必须在 LogtoConfig 中显式声明 resources,否则拿到的 Token 不含 API 权限:
const config = {
endpoint: 'https://logto.dr.restry.cn/',
appId: '<App_ID>',
resources: ['https://gateway.clawlines.net/api']
};
// 获取 API 专属 Token
const token = await getAccessToken('https://gateway.clawlines.net/api');
相关页面
Management API 使用
Rabbit 成功调通了 Management API,关键发现:
- Token endpoint:
https://logto.admin.dr.restry.cn/oidc/token(admin 租户)
- Management API:
https://logto.dr.restry.cn/api/...(default 租户)
- M2M 应用
m-default 位于 admin 租户,必须用 admin 的 token endpoint 认证
- 直接数据库 INSERT 有风险(会漏 secret 生成、tenant 关联等),应优先用 Management API
批量创建应用流程
- 用 admin 租户 M2M credentials 获取 access token
- 调用
POST /api/applications 创建 SPA 应用
- SPA 类型不需要 secret,只需 App ID + Endpoint
SSO 统一接入策略建议
- 每个站点一个 Application,不共用 App ID
- SPA 用
@logto/react SDK,纯后端用 JWT 验证
- 命名规范:
站点名-类型
- 无需改代码的方案:Caddy
forward_auth 对接 Logto
Logto 升级记录
| 版本 | 镜像来源 | 说明 |
|---|
| 1.30.1 | ghcr.io/logto-io/logto | 升级前 |
| 1.37.1 | northacr.azurecr.cn/logto | 升级后(通过 ACR 中转) |
clawlines.net 子域名分配(→ docker-runtime)
| 子域名 | 项目 | App ID |
|---|
| craft.clawlines.net | ClawCraft | 8bbiayv3m7sg8uetkbu5h |
| agent-project.clawlines.net | Agent Portal | wqzrwjesyo5medejdnfu6 |
| bi.clawlines.net | Agentic BI | a749dyaep3vsnv6pdu0jx |
| gateway.clawlines.net | Clawline Gateway | anbr9zjc6bgd8099ecnx3 |
| chat.clawlines.net | Clawline Client Web | j760nuoz0h3jr5g9ysogi |
注意:未备案域名不能解析到中国 IP,clawlines.net 需解析到 Azure Global 服务器。