admin
|
e51666c52e
|
浏览器免重登:HttpOnly cookie + 服务端 session 表 + 设备名持久化
- 新增 web_sessions 表(sqlc):refresh_token 以 AES-256-GCM 落盘,密钥取自
CDROP_SESSION_SECRET(env、不在库内);cookie 仅存不透明随机串,表 id 存其
SHA-256,故 DB 单独泄露既换不出可用 cookie、也解不出 token
- /auth/exchange 建 session 并下发 HttpOnly; Secure; SameSite=Lax; Path=/api/auth
cookie,响应体不再回传 refresh_token
- /auth/refresh 改为 cookie 驱动(7 天滑动失活),同时即开机静默免重登;
新增 /auth/logout(删 session + 清 cookie)、/auth/device(写设备名入 session)
- device_name 随 session 存,开机 refresh 带回前端,抗 iOS PWA 存储清除;
setup / 改名时 syncWebDeviceName 推送服务端
- striped per-session 锁串行化同会话并发 refresh,防一次性 refresh_token 被
花两次而把用户从所有 tab 登出
- 前端 store 移除 refreshToken 字段(长寿命凭据彻底不进 JS);main.tsx 首屏前
bootstrapAuth 用 cookie 静默续期,命中直接进已登录态、避免登录页闪现
- config:prod 强制 CDROP_SESSION_SECRET,缺失拒启动
- 桌面端不受影响(自有 loopback flow + Go keyring,不碰这两个端点)
|
2026-06-16 00:54:40 +08:00 |
|
admin
|
8f550adbb1
|
web:OAuth 回调成功后整页跳转,修 Safari 登录后资源加载卡死 ~2min
现象:Safari/PWA 从 Casdoor 回跳登录后,setup.js(路由 chunk)与用户头像约 2 分钟拿不到连接(连接号显示「-」),手动刷新即恢复;Chrome 正常。排查确认非 h3、非 service worker、非 SSE(/setup 时 startHub 被 !selfDeviceName 守卫拦下),服务端 curl 秒回。
根因:oauth.callback 登录成功后做的是路由软导航 navigate({to:"/"}),复用了 OAuth 流程遗留的 HTTP 连接,这些连接在 Safari 下会卡死后续同源/跨源资源请求约 2 分钟。整页重载能拿到全新连接(印证:手动刷新即好),故改 navigate 为 window.location.replace("/")。auth 已在 sessionStorage,同标签刷新存活;replace 不入历史,避免后退重触已消费的 code。
顺带移除因此 unused 的 useNavigate import。
|
2026-06-16 00:19:13 +08:00 |
|
admin
|
af754dc31f
|
web:service worker 不再拦截导航(修 Safari OAuth 回跳 ~2min 卡顿)
SW 之前以 network-first 接管所有导航请求,疑似在 Safari 下令 Casdoor→应用的回跳导航长时间挂起(~2min 似卡在 Casdoor 页)。改为:导航、/api、跨源一律直通网络,SW 只对同源 hash 化静态资源做 stale-while-revalidate。cdrop 离线无意义,放弃导航壳缓存无损失。cache 版本 bump v2 清旧缓存。
|
2026-06-15 23:08:19 +08:00 |
|
admin
|
7082ccc6bf
|
web:PWA 短名 CDrop → cdrop(去驼峰孤例)
面向用户的短名统一为小写 cdrop(与桌面窗口标题/菜单栏/启动提示一致);全名 Commilitia Drop 仍用于 manifest.name、<title>、品牌字标。改 site.webmanifest short_name + index.html apple-mobile-web-app-title / application-name。
|
2026-06-15 22:32:34 +08:00 |
|
admin
|
5c28ddf9b8
|
web:PWA 安装支持(manifest + iOS meta + service worker)+ PKCE 改 localStorage
让 web 前端可「添加到主屏幕」以独立窗口启动——iOS 上免证书的类原生体验(也使 Android/桌面出现安装提示)。
- site.webmanifest 补全可安装字段:id / start_url / scope / description / orientation;icons 拆出独立 any 与 maskable 条目。
- index.html 加 iOS 独立窗口 meta:apple-mobile-web-app-capable / status-bar-style / title + application-name(旧版 iOS 仍读这些才无 Safari chrome 启动)。
- public/sw.js(新):仅缓存同源静态壳,**绝不拦截 /api/***(SSE /api/hub/events、剪贴板、信令、中继需要实时不缓冲的网络连接,直接放行);跨源(字体/CDN)也放行。导航走 network-first(新部署即取新 HTML),静态资源 stale-while-revalidate。cdrop 离线无意义,故此 SW 只为可安装 + 秒开壳。
- main.tsx:SW 注册仅在浏览器 + prod;dev 下干扰 Vite HMR、桌面壳(Wails WebView,wails:// / loopback origin)SW 行为不可靠,故 isDesktop() 跳过。
- auth.ts:PKCE verifier / state 从 sessionStorage 改 localStorage。iOS 独立 PWA 可能在独立上下文跑完 OIDC 往返、回跳时重启 PWA 而清空 sessionStorage,导致 verifier 丢失登录失败;localStorage 跨上下文存活。verifier 在 callback 即消费并删除、且无配对 code 无用,落盘窗口的安全代价可忽略。
|
2026-06-15 22:14:18 +08:00 |
|
admin
|
f21fa5b5e8
|
cdrop — 跨 OS 剪贴板与文件传输服务
Commilitia Drop:自托管的跨设备剪贴板同步与点对点文件传输。
- 后端 Go(chi / SQLite WAL / SSE Hub / WebRTC signaling + 状态机 / Relay ring buffer),编译进单个 distroless 镜像(前端 go:embed)。
- 前端 React + TanStack Router + Zustand,自实现 SSE + WebRTC P2P,NAT 受阻时回退服务端中继;聚珍(Juzhen)CJK 综合排版。
- 桌面端 Wails v2(macOS / Windows),瘦客户端复用 web。
- 鉴权 OIDC PKCE(自建 Casdoor 等),refresh_token 信封加密存系统密钥库;iOS Shortcut 用 HS256 scoped token。
架构文档与变更记录见 docs 分支(PROJECT_BRIEF / FRONTEND_DESIGN / CHANGELOG)。
本次为公开发布初始提交:完整开发历史(含部署细节)留存于私有归档,公开仓库自此干净起步。
|
2026-06-15 21:38:28 +08:00 |
|