Logto SSO
把 Halo 的登录 / 注册入口完全交给 Logto,任何主题下点击登录都直达统一身份认证中心。
功能特性
- 一键接管登录:替换 Halo 默认登录页,所有登录 / 注册请求统一跳转到 Logto。
- 自动建号与绑定:首次通过 Logto 登录自动创建 Halo 账号;已登录时可将 Logto 身份绑定到现有账号。
- 邮箱验证状态同步:登录时按 Logto 返回的
email_verified原值写入 Halo 用户的邮箱验证状态;email_verified=false时不会误标为已验证。 - 手机号验证注解:登录时把
phone_number_verified写入用户注解logto.run/phone-verified。该注解仅镜像 Logto 侧状态,不代表 Halo 核心的用户验证状态(Halo 核心目前没有手机号验证字段)。 - 品牌 Logo 自动跟随:管理后台认证提供方的 Logo 自动读取上游 Logto 的品牌配置。
- 原生后台体验:在「用户 → 身份认证」中提供与 Halo 原生的「详情 / 设置 / 客户端」三标签一致的配置界面。
安装
- 在 Halo 后台「插件」中安装并启用本插件。
- 在 Logto 控制台创建一个「传统 Web 应用」,取得 应用 ID 与 应用密钥,回调地址填写
{baseUrl}/login/oauth2/code/logto-sso。 - 在插件「设置」中填写 Logto 服务端点、应用 ID、应用密钥,以及用于同步的 M2M 凭据,保存即可。
配置项
- Logto 服务端点:例如
https://your-tenant.logto.app。 - 应用 ID / 应用密钥:Logto 传统 Web 应用的凭据。
- M2M 应用 ID / 密钥:用于服务端调用 Management API 同步用户信息。
- 密码修改同步到 Logto(默认关闭):开启后才把控制台改密或新建用户时的密码发送给 Logto;关闭时仅在本站生效。
- 账号禁用 / 删除同步(默认关闭):按需开启将 Halo 的禁用、删除操作同步到 Logto。
密码同步与数据流向
- 默认
passwordPushEnabled=false:在 Halo 修改密码或新建用户时,不会把密码发送到 Logto。 - 显式开启后:Halo 控制台修改密码 / 新建用户会通过 HTTPS 请求把明文密码发送到 Logto Management API,仅用于保持 Logto 侧密码一致;密码只出现在该请求体中,不写入日志、不落库。关闭后仅在本站生效。
安全说明
- 插件不持久化 Logto 的 access token / refresh token,仅在进程内缓存;退出登录、删除用户、停用或卸载插件时清理遗留的 AuthorizedClient 记录。
- 客户端密钥、M2M 密钥保存在 Halo Secret 中,不在 ConfigMap 明文存放。
- 头像同步仅允许 http/https 的 80/443 端口,响应大小上限 2 MiB,拒绝内网 / 回环 / 云元数据地址与
image/svg+xml。 - 插件配置端点要求相应角色,匿名不可读取。
开源协议
本项目基于 GPL-3.0 开源,仓库地址:https://git.metapoint.tech:8443/sovlookup/halo-plugin-logto-sso
更新说明(0.3.100)
- 所有设置入口(包括「用户 → 身份认证 → Logto」设置页)保存应用密钥或 M2M 密钥时,统一写入 Halo Secret;ConfigMap 与
halo.run/data-snapshot不再保存明文。 - OAuth2 授权入口与回调仅处理
logto-sso,可与其它 OAuth2 登录插件同时启用。
更新说明(0.3.101)
- M2M token 端点也校验 issuer:携带 M2M 密钥换取 token 前校验 Logto 端点,避免密钥被发往内网/云元数据地址。
- Secret 读取失败不再覆盖密钥:写路径使用严格读取,空白更新不会清空已有 clientSecret / managementClientSecret。
- 原生设置页快照清理补全:保存设置时同时清理
halo.run/data-snapshot中的历史明文。 - 外部请求加固:登录回调 WebClient 增加 10 秒响应超时与 2MiB 响应体上限;品牌响应限制 512KiB;Management 创建用户失败日志不再打印完整响应体。
更新说明(0.3.102)
- ConfigMap 更新收口:所有设置入口保存密钥时统一写入 Halo Secret,ConfigMap 与数据快照不留明文。
- JSON Patch 防护:拒绝非对象形态的 ConfigMap Patch,避免绕过密钥清洗。
- 新建用户流程加固:先创建 Logto 身份、待 Halo 用户创建成功后再写绑定,失败回滚,避免把不存在的用户绑定到任意 Logto 身份。
- 响应体限制:Management API 与 token 响应增加 1 MiB 上限;密码重置接口只接受表单编码请求。
- 登出标记 Cookie:
logto-sso-session改为SameSite=Strict。
更新说明(0.3.103)
- OIDC 发现端点校验:发现文档中的授权、token、userinfo、JWKS 与 end_session 端点必须与 issuer 同主机;失败结果短时负缓存,避免被恶意 issuer 引向任意地址。
- 品牌与登出加固:品牌响应流式限制 512 KiB;登出端点只接受与 issuer 同主机的地址,否则回退到
{issuer}/session/end。 - 兼容性修复:绑定/登出只处理
logto-sso,不再干扰其它 OAuth2 插件;同时拦截 GET/POST/signup。 - 其它:说明页对回调地址做 HTML 转义;同步邮箱统一小写;修复设置文案。



