演进全景与 OIDC 实现解析)
OpenCloud 身份认证基石LibreGraph Connectlico演进全景与 OIDC 实现解析【免费下载链接】opencloud️ OpenCloud is the open source platform for file management, sharing and collaboration. Simple and sovereign.项目地址: https://gitcode.com/GitHub_Trending/op/opencloud导读LibreGraph Connect简称 lico是 OpenCloud 内建 OpenID Connect Provider 的核心组件为登录、授权、令牌签发和登出提供全套 OIDC/OAuth2 能力。本文以仓库中 vendor/github.com/libregraph/lico/CHANGELOG.md 的完整变更记录为骨架结合 lico 源码 与 OpenCloud IDP 服务 的实现系统梳理 lico 从 2017 年 v0.0.1 到 2026 年 v0.67.0 的能力演进让读者掌握其身份后端、外部授权机构authority、令牌与加密体系、客户端注册机制等核心设计以及如何通过环境变量与 YAML 配置将其接入 OpenCloud 部署。一、lico 在 OpenCloud 中的角色OpenCloud 的 IDP 服务services/idp/README.md明确说明该服务基于 lico 提供内建的极简 OpenID Connect Provider主要面向中小型部署对于更大规模的场景官方建议用外部 OIDC Provider 替换。IDP 默认使用 OpenCloud 的 IDM 服务作为 LDAP 后端完成用户查找与认证也可以通过一组环境变量切换到外部 LDAP 服务器。从代码层面看OpenCloud 的 IDP 服务直接复用了 lico 的多个包services/idp/pkg/backends/cs3/bootstrap/cs3.go 引入lico/bootstrap、lico/identifier、lico/identity与lico/identity/managersservices/idp/pkg/service/v0/service.go 挂载了 lico 内置的 guest、ldap、libregraph 三类后端支持bootstrap/backends目录下对应 guest.go、ldap.go、libregraph.go并组合 lico 的 config 与 server 包启动 OIDC 服务。换句话说lico 的变更日志实际上就是 OpenCloud 身份认证能力的演进史。下面按主题拆解这条主线。二、OIDC / OAuth2 核心能力从基础实现到完整标准族2.1 端点的诞生与定型从变更日志最早的版本即可看到 OIDC 能力是逐步补齐的v0.0.1实现.well-known发现端点、authorize端点基础实现、jwks.json端点、带 CORS 的token与userinfo端点、code flow 支持v0.2.0为发现文档开放 CORS、报告额外的受支持 scope、实现对offline_accessscope 的过滤处理v0.6.0实现endsession端点并在后续版本v0.11.0补上sidID Token claim、浏览器状态与会话状态v0.11.0 起实现 browser state 与 session state随后 v0.32.0 将端会话end session委托给外部授权机构v0.33.2 起用signed-out-uri作为 SAML SLO 的 goodbye 重定向兜底。最终在 oidc/provider/provider.go 的Provider结构中可以看到这一整套端点路径被固化为配置项wellKnownPath、jwksPath、authorizationPath、tokenPath、userInfoPath、endSessionPath、checkSessionIframePath、registrationPath并同时持有identityManager、guestManager、codeManager授权码管理器实现在 oidc/code/manager.go与clients注册表。2.2 标准族与扩展规范的落地lico 的 README.md 声明实现了以下 OpenID Connect 规范族OpenID Connect Core 1.0OpenID Connect Discovery 1.0OpenID Connect Front-Channel Logout 1.0OpenID Connect Session Management 1.0OpenID Connect Dynamic Client Registration 1.0。以及 RFC 6749OAuth 2.0、RFC 7517JWK、RFC 7519JWT、RFC 7636PKCE、RFC 7693BLAKE2b等基础规范。这些声明在变更日志中都有对应的落地记录动态客户端注册Dynamic Client Registrationv0.21.0 实现 OpenID Connect Dynamic Client Registration 1.0增加命令行参数允许动态注册、对动态注册客户端做 secret 校验、用特定前缀标识动态客户端 ID、支持客户端注册中的jwksv0.17.0并为动态客户端 secret 增加过期时间配置v0.34.0PKCEv0.20.0 实现 RFC 7636 的 PKCE code challengev0.28.1 修复 oidc-go 中 PKCE Base64URL padding 问题请求对象与 claims 参数v0.17.0 实现 OIDC authorize 的request对象支持、claims参数支持分两阶段落地、auth_timeclaim 请求支持、sub请求 claim 校验、invalid_request_object错误码同一版本还支持把请求携带的 claims 透传进 ID Token 与 userinfo多响应类型与 promptv0.59.0 正确处理外部 OIDC 的promptselect_account与consentv0.26.0 在外部授权机构认证完成后强制promptnone以规避循环v0.33.7 同样为规避与外部授权机构的循环而设置promptNonev0.53.1 修复无用户时promptnone不应展示登录页的问题v0.63.0 允许不带openidscope 的 authorize 请求scope 体系v0.7.0 实现 scope 限制v0.16.0 新增scopes.yaml配置并允许上报配置过的 scopev0.52.0 支持 identifier 后端扩展请求的 scopes 与授权 scopesv0.56.0 为服务端注册的客户端增加隐式 scopesimplicit scopes支持v0.53.0 支持基于 scope 的 libregraph 身份后端选择scope 的元数据定义在 identifier/meta/scopes 包中模板文件为 scopes.yaml.in令牌 claim 完善v0.9.0 为 ID Token 与 userinfo 增加额外 claims 支持v0.11.0 增加sidclaimv0.17.0 为 access/refresh token 增加jticlaim 并支持auth_timev0.52.0 统一内置 scopes 与 access/refresh token claimsv0.53.1 把 identifier 身份注入 token 请求上下文v0.57.0 允许后端设置顶级 ID Token claimsv0.63.0 修复经 lg 后端提供 access tokensidclaim 的问题刷新令牌与撤销v0.65.0 在 refresh 时保留后端提供的额外 id/access token claims、refresh token grant 返回 id tokenv0.64.0 为 lg identifier 后端会话实现 refresh 与 revoke并把真实源 IP 与 user agent 传给后端签名算法v0.14.0 默认改用 RSA-PSSPS256作为 JWT 算法并拒绝低指数 RSA 密钥v0.22.0 实现 EdDSA 密钥支持并统一 RSA-PSS salt 长度v0.13.1 修复 RSA-PSS 签名盐长度v0.12.0 允许切换签名方法并支持附加校验密钥。2.3 客户端注册模型客户端通过静态配置文件注册模板见 identifier-registration.yaml.in。该模板展示了完整的客户端字段id/name客户端唯一标识与展示名application_typeweb或nativetrusted/insecure可信客户端可直接跳过二次确认insecure用于测试secret客户端密钥如 identity/clients 中所定义与校验redirect_uris/origins允许的重定向 URI 与来源trusted_scopes可信客户端直接获得的 scopes如LibreGraph.GuestOK、LibreGraph.NumericIDimplicit_scopes注册即隐含授予的 scopesjwks客户端公钥集配合request_object_signing_alg如 ES256验证 request object 签名external_authorize_redirect_urisv0.67.0 新增的按客户端外部授权重定向 URI支持形如MyApp.Special:https://my-external-login:8443/authorize-special的按 scope 指定 URI。同一模板还包含外部授权机构authority注册示例见下文第四节。此外v0.34.0 允许原生客户端使用127.0.0.1、[::1]与无路径的redirect_urisv0.29.0 允许原生客户端 redirect URI 使用动态端口v0.65.0 允许仅含 scheme 的 redirect URI。三、身份后端演进从测试玩具到可插拔体系身份后端identity backend / manager决定用户从哪来、如何认证。变更日志清晰记录了这条演进线v0.0.1cookie backend 与 cookie identity manager 诞生仅用于测试同时有 dummy 后端用于测试v0.3.0实现 LDAP 后端与 LDAP 限速器、auth_timeclaim、存储登录时间并校验最大期限v0.4.0identifier 实现 family_name/given_name、uuid 属性支持、LDAP 描述符大小写不敏感、UUID 解码v0.5.0identifier 加入客户端注册表与校验v0.5.2/v0.5.3 引入no_uid_auth标志v0.50.0实现通用的 libregraph 后端generic backend可插拔后端pluggable backends体系成型同时移除部分旧后端v0.51.0libregraph 后端支持 open extensionsv0.52.0支持accountEnabled属性、后端扩展请求 scopes、刷新令牌时刷新用户数据、后端注入额外 HTTP 请求头、支持顶级 at claimsv0.53.0libregraph 后端支持会话sessions与基于 scope 的后端选择v0.64.0lg identifier 后端会话实现 refresh/revoke并透传真实源 IP 与 user agent。目前仓库中可插拔后端的落点包括引导层后端bootstrap/backends 下的 guest、ldap、libregraph 三套identifier 层后端identifier/backends 下的 ldap 与 libregraph身份管理器identity/managers 下的 cookie、dummy、encryption、guest、identifier 管理器其中 encryption 管理器用 nacl.secretbox 实现 cookie 加密v0.0.1 引入。OpenCloud 的 cs3 后端则通过 services/idp/pkg/backends/cs3 把 lico 的 libregraph 后端能力接到 CS3 身份体系上具体见 cs3.go 与 user.go。四、外部授权机构AuthorityOIDC 与 SAML2 联邦登录lico 支持把登录委托给外部身份提供方external authority这也是企业联邦登录的关键能力v0.29.0起准备外部授权机构支持并区分不同 authority 类型v0.30.0实现 SAML2 外部授权机构支持并附上示例配置v0.31.0完善 SAMLIdP 发起的 SLO 请求校验、SAML IdP SLO 支持、redirect binding 的 SLO response、外部授权机构的过期与 session id、SAML 初始化失败重试、从 LDAP 后端解析用户时应用用户映射v0.32.0实现把 end session 委托给外部授权机构v0.33.0实现外部 OIDC 授权机构的 end session trampoline跳板v0.56.0修复外部授权机构连接对 HTTP/2 的支持v0.57.0 修复 authorities 注册 YAML 中 JWKS 的解析、支持从 PEM 编码证书加载校验器v0.58.0为外部 OIDC 授权机构实现 code flowv0.59.0正确传递promptselect_account与consentv0.63.0移除安全 referrer/origin 检查中 Host header 的:443端口。注册与解析实现在 identity/authorities/registry.goNewRegistry读取注册配置文件先yaml.YAMLToJSON转 JSON 再反序列化因为 jose 的JSONWebKeySet自定义反序列化不支持 YAML随后按authority_type分派到newOIDCAuthorityRegistration或newSAML2AuthorityRegistration对应 oidc.go 与 saml2.go。SAML2 的 XML 签名验证依赖 identity/authorities/samlext 下的 dsig 与登出请求/响应解析v0.33.11 专门增加了 SAML 处理前的 XML 校验。identifier-registration.yaml.in 中的 authorities 示例给出了两类配置要点OIDC 类型authority_type: oidc、client_id、jwks含 EC 公钥示例、default、authorization_endpoint、response_type、scopes、identity_claim_name、identity_aliases外部用户到本地用户的映射、identity_alias_requiredSAML2 类型authority_type: saml2、entity_id、trusted、discover、metadata_endpoint、identity_claim_name、end_session_enabled。五、安全加固与加密体系5.1 密钥与签名v0.0.1 引入密钥加载与加密管理器nacl.secretbox 加密 cookie、JWKS 端点v0.3.0 支持加载 PKCS#8 密钥与从文件加载全部密钥v0.14.0 拒绝低指数 RSA 密钥、默认使用 RSA-PSSPS256v0.22.0 实现 EdDSA 支持、统一 RSA-PSS salt 长度、支持 TLS 客户端认证、从.json文件加载 JSON Web Keysv0.54.0 允许设置 LDAPS 连接的 CA 证书、在 TLS 配置上设置 ServerName。README 建议用 Step CLI 生成 lico 所需的多种格式密钥OpenSSL 无法覆盖全部格式例如 RSA 4096、EC P-256、Ed25519 JWK 等JWT 验证示例为step crypto jwt verify --iss $ISS --aud ... --jwks $ISS/konnect/v1/jwks.json。若未提供签名密钥lico 启动时会生成随机的非持久 RSA 密钥只适合调试。5.2 会话、Cookie 与状态v0.27.0 为所有 cookie 设置SameSiteNonev0.59.0 将状态 cookie 时长增加到 10 分钟v0.32.0 改进临时状态与 consent cookie 的命名及删除路径v0.62.0 允许修改 Same-Site cookie 值以增强安全性v0.61.2 限制 oidc check session iframe 的 postMessage hook 范围Session Management 安全收敛v0.11.1 修复 end session 端点 subject 校验v0.33.2 增加post_logout_redirect_uri非空校验v0.54.0 避免 endsession 回调 URL 查询参数重复添加 state。5.3 输入校验与注入防护v0.61.0 构造 LDAP filter 时转义 filter 值、LDAP attribute types 大小写不敏感v0.14.4 比较 LDAP 属性大小写不敏感v0.33.3 使用服务器提供的用户名避免大小写不匹配v0.33.11 在 SAML 处理前校验 XMLv0.33.1 修复 SAML2 登出请求解析、修复无 state 时的 panicv0.63.0 移除安全 referrer/origin 检查中 Host header 的:443v0.23.2 修复 Chrome 自动填充检测v0.23.1 修复空 keyframes 移除问题。5.4 依赖安全维护变更日志中大量条目是依赖升级bump覆盖github.com/go-ldap/ldap/v3、golang-jwt/jwtv4→v5 迁移、go-jose/go-jose/v3、crewjam/saml、russellhaering/goxmldsig、prometheus/client_golang、golang.org/x/crypto、golang.org/x/net、golang.org/x/oauth2、spf13/cobra、rs/cors、beevik/etree以及 identifier 前端的braces、path-to-regexp、ws、vite、follow-redirects、loader-utils等。这类条目大多属于安全补丁与兼容性维护例如 v0.61.2 的follow-redirects、v0.65.0 的braces、v0.63.0 的semver、v0.59.3 的loader-utils均对应已知漏洞修复。Go 工具链要求也从 Go 1.9 一路升到 README 中声明的Go 1.24。六、Identifier WebApp登录界面的工程化与品牌化lico 内置的 identifier 是一套 React Web 应用负责登录、consent、账户选择、登出等界面构建体系v0.2.0 引入 webpack 代码分割与 service workerv0.23.0 升级 React/Material-UI/react-routerv0.61.0 从 react-scripts 迁移到viteidentifier/vite.config.js并升级 3rd-party JavaScript 依赖国际化v0.15.0 为 identifier 加入 i18nv0.23.0 支持翻译内建 scope 描述、加入语言选择器v0.24.1 启用冰岛语等更多语言v0.54.0 按 ietf code 支持中文、cookie 记录语言选择、限制可用 locale、修正错误消息翻译插值可用性v0.63.0 在登录对话框加入密码可见性图标v0.61.0 改进登录表单字段视觉v0.65.0 支持login_hint预填登录名并把焦点放到密码框v0.65.1 修复相关焦点与校验问题品牌化v0.50.0 支持 identifier 视觉品牌定制、用通用应用图标替换 Kopano logov0.54.0 使用 LibreGraph 品牌名生成第三方许可清单v0.61.1 修复品牌设置缓存v0.66.0 支持品牌可选 URLv0.67.0 用命名尺寸重构 banner logo 高度并新增--identifier-default-banner-logo-height配置项。在 OpenCloud 中identifier 的翻译并非由 OpenCloud 维护而是随嵌入的 lico identifier 包一起提供见 services/idp/README.md。七、运维与部署要点7.1 启动参数与密钥准备根据 lico README运行 licod 必须准备三类材料签名私钥openssl genpkey -algorithm RSA -out private-key.pem -pkeyopt rsa_keygen_bits:4096经--signing-private-key传入支持 PEM 编码的 PKCS#1、PKCS#8 与.jsonJWK 文件。缺省时启动会生成随机的非持久 RSA 密钥加密密钥openssl rand -out encryption.key 32生成 32 字节密钥经--encryption-secret传入用于加密 cookie 等敏感值Issuer 标识--iss https://example.com必须是完整 https URIOIDC 要求issuer 子路径在计算 well-known 配置 URI 时会被保留v0.56.0同时--uri-base-path支持反向代理子路径模式v0.33.9、v0.22.0。客户端注册通过--identifier-registration-conf指向复制自 identifier-registration.yaml.in 的配置文件。若未显式注册任何客户端lico 只接受重定向 URI 以--iss值为前缀的客户端。令牌过期时间也可配置v0.33.0 支持配置 OIDC access/id/refresh token 过期时间。7.2 通过 TLS 代理暴露端点Caddyfile.example 展示了典型的反向代理布局lico 监听127.0.0.1:8777由 Caddy 在*:8443提供 TLS并把以下端点透明代理出去/.well-known/openid-configuration发现文档/konnect/v1/jwks.json、/konnect/v1/token、/konnect/v1/userinfo、/konnect/v1/static、/konnect/v1/session、/konnect/v1/register/signin/identifier 登录区域。前端代理的基地址即--iss参数的值。此外 v0.25.0 起增加基础 metricsv0.25.1 暴露 metrics 监听端口v0.23.6 增加 healthcheck 子命令。7.3 在 OpenCloud 中配置自定义客户端OpenCloud 侧services/idp/README.md默认会为 Web、桌面、iOS、Android 客户端生成 OIDC 客户端配置如需额外客户端可在opencloud.yaml的idp段注入clients列表且该列表必须包含全部客户端含标准客户端。示例新增一个供 oidc-agent 使用的公开原生客户端clients: - id: oidc-agent name: OIDC Agent trusted: false secret: redirect_uris: - http://127.0.0.1 - http://localhost post_logout_redirect_uris: [] origins: [] application_type: native八、版本里程碑总览以下按时间线汇总变更日志中的关键版本节点依赖升级类条目已并入上文相应主题版本日期核心里程碑v0.0.12017-10-02首个提交OIDC 基础authorize/well-known/jwks/token/userinfo、cookie 与 dummy 后端、nacl.secretbox 加密v0.1.02017-11-27identifier 与 kc 后端、logoff API、welcome/logoff UI、Referer-Policy、检查 logon/hello cookiev0.2.02017-11-29多 scope 展示、consent 取消与 loading 状态、webpack 代码分割、CSP 默认策略v0.3.02018-01-12LDAP 后端与限速器、PKCS#8 密钥、auth_time claim、可信代理、登录时间最大期限v0.4.02018-01-30Dockerfile、family_name/given_name、uuid 属性、LDAP 引导错误处理v0.5.02018-03-16identifier 客户端注册与校验、端口 3001 开发模式v0.6.02018-05-28endsession 端点与 consent 检查、客户端 secret 配置v0.7.02018-07-17scope 限制、kpop 0.5 / Material-UI 1v0.8.02018-07-27通过 scope 支持 url-safe subv0.9.02018-08-01ID Token 与 userinfo 附加 claims、authorize 响应返回 scopev0.10.02018-08-17日志级别命令行参数、systemd unit 与 runner 脚本v0.11.02018-09-06sid claim、browser state 与 session statev0.12.02018-09-12签名方法可切换、后端身份提供方会话支持、kc session 超时配置v0.13.02018-09-17用 kcoidc auth 对接 kc 会话v0.14.02018-09-21默认 RSA-PSSPS256、拒绝低指数 RSA 密钥v0.15.02018-10-31Konnect Identifier REST API 的 OpenAPI 3 规范、identifier i18nv0.16.02018-11-30scopes.yaml 配置、scope 元数据移到后端v0.17.02019-01-22request object、claims 参数、jti claim、动态客户端注册 jwks、guest 用户支持v0.18.02019-01-22强制 ldap 后端的身份 claims、无需 guest manager 启动v0.19.02019-02-06pem2jwk 转换工具、受信客户端的 guest 身份支持v0.20.02019-03-15PKCERFC 7636、preferred_username claim、LDAP subject 来源可配置v0.21.02019-03-24OpenID Connect Dynamic Client Registration 1.0v0.22.02019-04-26EdDSA、TLS 客户端认证、URI base path、Delve 调试make dlvv0.23.02019-05-09i18n 完善、语言选择器、翻译内建 scope 描述、Apache-2.0 许可v0.24.0–v0.25.x2019-07~09健康检查子命令、基础 metrics、metrics 端口、自动 survey 上报v0.26.02019-11-11去除 issuer 子路径、外部授权后强制 promptnonev0.27.02019-11-25Go Modules 迁移、所有 cookie 设 SameSiteNonev0.28.0–v0.29.02019-12kcc-go v5、konnect 可作为库使用、原生客户端动态端口v0.30.02020-03-09SAML2 外部授权机构支持、disable-identifier-webapp 选项v0.31.02020-04-09SAML SLO 全流程、外部授权机构过期与 session id、LDAP 用户映射v0.32.02020-04-15end session 委托外部授权机构、SLO redirect bindingv0.33.x2020-04~12令牌过期时间可配置、SAML 修复与 XML 校验、endsession state 随机化v0.34.02021-05-06原生客户端 localhost/无路径 redirect URI、动态客户端 secret 过期v0.50.02021-10-14通用 libregraph 后端、可插拔后端体系、品牌视觉定制、Go 1.17v0.51.0–v0.53.12021-10~12open extensions、libregraph 后端会话与 scope 选择、accountEnabled、promptnone 修复v0.54.02022-03-15identifier 中文 i18n、LDAPS CA 证书、TLS ServerNamev0.55.0–v0.58.02022-04~09Go 1.18、外部 OIDC code flow、Yarn 2、CI 构建v0.59.0–v0.61.22022-09~2024-02react-scripts→vite 迁移、SameSite cookie 可配置、LDAP filter 转义、状态 cookie 10 分钟v0.62.0–v0.65.12024-05~12check session iframe 安全收敛、login_hint、刷新令牌返回 id token、lg 后端 refresh/revoke、legacy 插件v0.66.02025-05-12移除内置 survey 客户端、品牌可选 URL、Go 1.22/1.23 工具链v0.67.02026-03-18签名 JWT 自动登录流LibreGraph.SignedLoginOK、按客户端外部授权重定向 URI、banner logo 高度可配置、完整 LibreGraph Connect OpenAPI 规范替换旧 identifier API需要注意变更日志中 v0.50.0 之后直接跳到 v0.34.0存在一段未记录的版本区间从记录看这是版本编号体系的收敛lico 继承自 Kopano Konnect 的历史版本号具体调整原因在变更日志中未说明。九、结语从 2017 年的 OIDC 最小实现到 2026 年的 v0.67.0lico 的能力演进覆盖了标准合规Discovery、Dynamic Client Registration、Session/Front-Channel Logout、PKCE、request object、多后端身份接入LDAP、libregraph、guest以及 OpenCloud 的 cs3 后端、外部联邦授权OIDC 与 SAML2 authority、密码学加固RSA-PSS/EdDSA/JWK、nacl.secretbox cookie 加密与登录界面的工程化品牌化。对 OpenCloud 而言理解这份变更日志就等于掌握了其内建 IDP 的完整能力边界小规模部署可直接依赖它大规模部署则可用同样的 OIDC 标准族平滑迁移到外部身份提供商。更深入的信息可继续阅读 lico README、客户端注册模板、Caddyfile 示例 与 OpenCloud IDP 服务说明。【免费下载链接】opencloud️ OpenCloud is the open source platform for file management, sharing and collaboration. Simple and sovereign.项目地址: https://gitcode.com/GitHub_Trending/op/opencloud创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考