Skip to content

Support OIDC authentication#16794

Open
sujoshua wants to merge 10 commits intosiyuan-note:devfrom
sujoshua:feature/oidc-login
Open

Support OIDC authentication#16794
sujoshua wants to merge 10 commits intosiyuan-note:devfrom
sujoshua:feature/oidc-login

Conversation

@sujoshua
Copy link
Copy Markdown

@sujoshua sujoshua commented Jan 7, 2026

Related: #16560

待实现:

后端

  • OIDC 基础框架:实现 provider 无关的统一抽象 OIDC 处理层
    • 实现 /auth/oidc/login 通用处理:构造 provider、生成 session state/nonce、获取认证地址
    • 实现 /auth/oidc/callback 通用处理:校验 state/nonce、调用 provider 处理、保存 session、处理 rememberMe
      • to 参数安全清洗并回跳
      • 优雅返回错误信息到前端
    • 抽象 provider 接口,实现以下 provider
      • Google
      • Microsoft
      • GitHub
      • Custom OIDC
    • 统一 filter 系统:基于 claims 决定是否允许登录
      • 正则
      • 忽略大小写正则
      • 字符串匹配
      • 忽略大小写字符串匹配
  • 暴露相关接口给前端设置界面
  • 重构 accessAuthCode 保存方式,UI 允许 Docker 部署也能修改
  • 重构 Docker 启动校验:移动到 InitConf 之中;OIDC 或 AccessAuthCode 任一满足即通过
  • Docker CLI 支持:允许通过启动参数/环境变量注入 OIDC 配置
  • 重构 CheckAuth 函数,优化逻辑
    • 更加统一的处理流程
    • 允许 OIDC 方式登录
  • 统一 Websocket 与 CheckAuth 认证

前端

  • 登录页适配(auth.html)
    • 显示 OIDC 登录按钮与 providerName
    • “记住我”与 OIDC 登录联动(传 rememberMe)
    • accessAuthCode 关闭且 OIDC 启用时,仅显示 OIDC 登录
    • to 参数透传与后端oidc错误提示显示
  1. authcode + OIDC
image
  1. OIDC
image
  1. OIDC 错误提示
image
  • 设置面板(config UI)
image image
  • OIDC 开关与 provider 选择
  • 按 provider 动态显示字段(clientID/secret/redirectURL/scopes/filter)
  • Filter 配置 UI:正则/字符串、是否忽略大小写
image
  • Docker 端允许修改 accessAuthCode(去掉隐藏条件)
    • accessAuthCode开关(留空即关闭)
    • 设置界面检测 Docker 环境下 OIDC和accessAuthCode是否至少一项开启
image
  • 添加注释说明:强烈建议用户在确保OIDC正常工作的前提下,才关闭accessAuthCode登录方式
image

客户端 OIDC 适配

  • 引入 Flow (web/desktop/mobile) 区分多端登录场景

  • PKCE 支持

  • Desktop 支持:

    • 前端获取环境,以 flow=desktop 请求后端登录接口
    • 前端调用 shell.openExternal 打开系统浏览器,并显示 Loading 状态
    • 前端实现轮询机制定时请求 /auth/oidc/check 接口获取认证状态
    • 后端 OIDCCallback 识别 flow 渲染专属落地页 oidc-callback.html 展示成功/失败状态,并更新结果以让轮询获取结果
      image
      image
  • Mobile Android 支持:

    • related: Add oidc support siyuan-android#25
    • 前端获取环境,以 flow=mobile 请求后端登录接口
    • 前端通过 JSAndroid.openAuthURL 打开 Custom tabs,进入系统浏览器页面
      image
    • Android 原生层监听 cstom uri scheme (siyuan://oidc-callback) 回调,并调用前端暴露 window.handleOidcCallbackLink 全局方法传递回调参数
    • 前端解析 siyuan://oidc-callback 回调参数,转发到内核完成登录
  • Mobile IOS 支持:

    • related: feat: iOS app add OIDC auth siyuan-ios#2
    • 前端获取环境,以 flow=mobile 请求后端登录接口
    • 前端通过 webkit.openAuthURL 调用 ios 原生ASWebAuthenticationSession,进入系统浏览器页面
    • ios 原生层监听 custom uri scheme (siyuan://oidc-callback) 回调,并调用前端暴露 window.handleOidcCallbackLink 全局方法传递回调参数
    • 前端解析 siyuan://oidc-callback 回调参数,转发到内核完成登录
  • 鸿蒙支持

杂项

  • Docker 网页端测试
  • PC 端测试
  • Android 端测试
  • iOS 端测试
  • Harmony 端测试
  • 用户文档撰写(配置说明、回调地址、常见问题)
  • i18n 文案补齐

@sujoshua sujoshua changed the title [WIP] OIDC Support authentication [WIP] Support OIDC authentication Jan 7, 2026
@88250 88250 moved this to Short Term in SiYuan Roadmap Jan 8, 2026
@88250 88250 moved this from Short Term to In Progress in SiYuan Roadmap Jan 8, 2026
@88250 88250 added the Feature label Jan 8, 2026
@88250 88250 added this to the 3.7.0 milestone Jan 8, 2026
Signed-off-by: Joshua Su <i@joshua.su>
Signed-off-by: Joshua Su <i@joshua.su>
@sujoshua sujoshua force-pushed the feature/oidc-login branch 2 times, most recently from ec18429 to fecbadc Compare January 15, 2026 11:37
- reorganize OIDC logic and move login state from session into local state map (for future siyuan://oidc-callback support)
- add OIDC config hash so auth becomes sensitive to config changes, trigger re-login on config change for stronger security

Signed-off-by: Joshua Su <i@joshua.su>
@sujoshua
Copy link
Copy Markdown
Author

sujoshua commented Jan 18, 2026

网页端实现已经基本完成。

但移动端+PC的客户端回调处理比我预想的复杂很多。
我可能仍然需要1-2周的时间,构思一个客户端的统一回调处理方案

@88250
Copy link
Copy Markdown
Member

88250 commented Jan 18, 2026

收到,目前距 v3.7.0 发布还早,可以慢慢实现。

@sujoshua
Copy link
Copy Markdown
Author

sujoshua commented Feb 3, 2026

想请作者考虑提供一个简单的官方 302 重定向入口(其实让用户自己搭建也行),用于 Google 移动端 OIDC 回调。

Google 在移动端出于安全原因禁用自定义 scheme,siyuan://oidc-callback 无法直接作为回调地址。官方建议使用 SDK,但国内环境不一定具备 Google 服务,而且引入 SDK 对现有框架过重。

我尝试统一回调到 http://127.0.0.1:6806 ,但移动端切换浏览器上下文时内核容易被系统快速冻结(即便保活也不稳定),回调容易丢失。

目前最轻量的方案是:官方提供一个重定向入口,把请求 302 转成 siyuan://oidc-callback 即可,避免对 Google 做过多额外适配。 可以直接提供一个接口,也可以返回一个静态前端页面靠js重定向。

Go 接口示例:

package main

import (
	"net/http"
	"strings"
)

func main() {
	http.HandleFunc("/some-path", func(w http.ResponseWriter, r *http.Request) {
		query := ""
		if r.URL.RawQuery != "" {
			query = "?" + r.URL.RawQuery
		}
		http.Redirect(w, r, "oidc://oidc-callback"+query, http.StatusFound)
	})

	_ = http.ListenAndServe(":80", nil)
}

@88250
Copy link
Copy Markdown
Member

88250 commented Feb 7, 2026

你看下是不是这样:

Request:

http method: GET
endpoint: https://cloud-server/apis/siyuan/oidc302?foo=bar

Response:

status code: 302
header: location: oidc://oidc-callback?foo=bar

用 util.GetCloudServer() 获取 cloud-server 地址。

@sujoshua
Copy link
Copy Markdown
Author

你看下是不是这样:

Request:

http method: GET
endpoint: https://cloud-server/apis/siyuan/oidc302?foo=bar

Response:

status code: 302
header: location: oidc://oidc-callback?foo=bar

用 util.GetCloudServer() 获取 cloud-server 地址。

没错

新年快乐!

@sujoshua sujoshua changed the title [WIP] Support OIDC authentication Support OIDC authentication Feb 20, 2026
@sujoshua
Copy link
Copy Markdown
Author

除了鸿蒙,桌面端/android/ios(感谢@RisingSSR 帮助)都实现好了。

鸿蒙我实在没设备开发测试,鸿蒙的native层需要作者帮忙实现一下。
前端的上层接口都留好了,native实现可以参考android。主要就是

  1. 在native 实现 openAuthURL 接口
  2. native 将 custom uri 转发到前端预留的统一回调函数window.handleOidcCallbackLink

@88250
Copy link
Copy Markdown
Member

88250 commented Feb 21, 2026

鸿蒙端暂时就不实现吧,感谢。

@sujoshua
Copy link
Copy Markdown
Author

sujoshua commented Apr 3, 2026

最近我有空,要不一起推进下这个功能合并?看看还差什么

@88250
Copy link
Copy Markdown
Member

88250 commented Apr 4, 2026

收到,先麻烦帮忙解决下冲突。

@88250
Copy link
Copy Markdown
Member

88250 commented Apr 24, 2026

@sujoshua 目前还差这两项:

image

@sujoshua
Copy link
Copy Markdown
Author

@sujoshua 目前还差这两项:
image

收到,最近有点忙,我尽快解决

@88250 88250 modified the milestones: 3.7.0, 3.8.0 Apr 26, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

Status: In Progress

Development

Successfully merging this pull request may close these issues.

3 participants