跳转至

SSO 与 OIDC

NereidAI 为整套件提供单点登录。身份事实来源只有一个,各产品经由两种模式之一与其 集成。模型刻意保持狭窄:Sphere是套件 SSO 入口,也是唯一与身份 平面 Identity对接 OIDC 的组件。

两种集成模式

模式 谁在浏览器侧完成登录 产品如何获得身份
ns(默认)——票据交接 Sphere(对着 Identity) Sphere 签发一张短时、一次性、绑定受众的密封票据;产品后端服务端到服务端换取已验证身份,再建立自己的会话。
oidc——直连 OIDC 客户端 产品自身(对着 Identity) Sphere 把浏览器直接重定向到产品;产品自行走 OIDC 授权码 + PKCE 登录并建立自己的会话。

Sphere 与产品必须就模式达成一致。 一旦不一致,用户就会遇到登录死循环或票据 / 重定向 错误——这是最常见的集成配置错误。

sequenceDiagram
    participant U as 浏览器
    participant NS as Sphere
    participant NI as Identity
    participant P as 产品

    U->>NS: 打开门户或某个产品
    NS->>NI: 授权码 + PKCE
    NI-->>NS: 令牌(经 JWKS 验证)
    NS-->>U: 密封的 ns_session Cookie
    U->>NS: GET /auth/enter/{product}
    NS-->>U: 302 跳转到产品回调并携带密封票据
    U->>P: 落到产品回调
    P->>NS: 服务端到服务端验票(共享密钥)
    NS-->>P: 已验证的身份快照
    P-->>U: 产品本地会话

在票据流程中,浏览器只持有 Sphere 的会话 Cookie,因此由独立方托管的产品无法依赖自己的 身份 Cookie——这正是需要服务端到服务端换取的原因。在直连 OIDC 流程中,产品自身的 会话与 Sphere 无关。

默认为 ns

门户默认把每个集成产品设为票据模式,且每个产品都有自己的开关。混合部署是一等 公民——例如某个产品走直连 OIDC,其余走票据。无论哪种,浏览器都只需在 Sphere 登录 一次。

身份的事实来源

  • Identity(身份引擎,当前为 Keycloak,realm nereidai)是身份的唯 一事实来源。该引擎可在已发布的 OIDC 契约之后被替换。
  • Sphere 从不存储用户。 其账号控制台通过服务账号客户端、经身份平面的 Admin API 管理身份——从不使用引擎自身的 master 密码。
  • 本地 bcrypt 账号仅是应急通道。 Sphere 可以在部署时声明本地账号运行,但该模式是 身份平面不可达时的应急路径——绝不是生产默认。

授权属于产品本地

身份与授权是两件事。Identity/Sphere 提供身份——主体、邮箱、姓名,以及一小组粗粒度套件角色—— 而 RBAC、租户与功能权限完全留在各产品内部。有效的 Sphere 会话只证明用户是谁,本身 并不授予对某个产品的访问权。

产品访问权通过形如 /nereid{product}/{tenant}/{role} 的套件分配组授予。这是 套件级的默认拒绝策略:对某产品没有分配组的用户无法进入该产品。唯一例外是 realm 管理员,他隐含地管理每个产品,因此新部署的引导管理员永不会被锁在门外。见 RBAC。

身份联邦

客户的身份系统——OIDC 或 SAML 2.0(Entra ID、Okta、Auth0、AD FS 等)——一律经由 身份代理(Identity Brokering)接在 Identity 之后,绝不直接对接 Sphere 或 某个产品。新增、替换或移除客户 IdP 无需改动 Sphere 或产品:它们始终看到同一个 issuer、 同一批客户端与同一组声明。把客户的分组映射到套件角色只在一处完成,即在代理处。

唯一例外是脱离套件单独售卖的单产品,它可以直接对客户 IdP 配置为标准 OIDC 依赖方。这明确处于套件治理之外,并随各产品仓库文档化。

直连 NI 的客户端

身份平面发布一小组客户端:

  • Sphere 登录客户端始终存在——在默认(票据)集成中,Sphere 是唯一的 OIDC 依赖方。
  • 各产品客户端只为以直连 OIDC 模式部署的产品存在,各自带固定回调路径。票据流程 不需要它们;票据所用的产品回调是产品自身的路由,而非身份平面的客户端。

资源所有者密码凭据(grant_type=password)在任何地方都不使用:它已被 OAuth 2.0 最佳实践弃用,妨碍 MFA 与通行密钥,也无法对接被代理的身份提供方。

运维文档

客户端注册、realm 供给与代理 IdP 配置细节在各产品仓库中: github.com/NereidAI。

相关