FIT2CLOUD
Logto SSO 的图标

Logto SSO

135
15

把 Halo 的登录/注册入口完全交给 Logto:任何主题下点击登录都直达统一身份认证;登录时按 Logto 登录 claims 同步邮箱验证状态与手机号验证注解(注解不代表 Halo 核心验证状态)。

  • Logto SSO —— 把 Halo 登录统一交给 Logto,后台原生三标签配置

    Logto SSO —— 把 Halo 登录统一交给 Logto,后台原生三标签配置

  • 客户端:OIDC 端点与回调地址一目了然,支持一键复制

    客户端:OIDC 端点与回调地址一目了然,支持一键复制

  • 设置:填写 Logto 服务端点与应用凭据,密钥安全掩码

    设置:填写 Logto 服务端点与应用凭据,密钥安全掩码

  • 详情:显示名称、描述与登录入口

    详情:显示名称、描述与登录入口

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 原生的「详情 / 设置 / 客户端」三标签一致的配置界面。

安装

  1. 在 Halo 后台「插件」中安装并启用本插件。
  2. 在 Logto 控制台创建一个「传统 Web 应用」,取得 应用 ID 与 应用密钥,回调地址填写 {baseUrl}/login/oauth2/code/logto-sso。
  3. 在插件「设置」中填写 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 转义;同步邮箱统一小写;修复设置文案。

讨论(0)

这是一个开源应用,我们推荐优先在开源仓库中提交 issue,以便开发者更好地接收和跟进问题。

去提交 issue