refactor: 个人自用,移除登录与云同步全链路
站点只给本人用,云乐坊 SSO 授权、收藏/历史云同步、获客归因和账号切换记账都没有收益,却被登录状态检查和同步失败提示持续打扰。 - 删除 useYunlefunAuth / yunlefunAuth / yunlefunSsoConfig / yunlefunAuth 适配器、useUserDataSync / userDataSync / userData 适配器、三个 client 插件与 /auth/callback 回调页 - 抽出 adapters/cloudbase.ts,让「反馈一下」和匿名筛选信号不再依赖登录态;cook-feedback 云函数保留 - 删除 cook-user-data 云函数与 cook_user_data 权限规则,移除 @yunlefun/sso 依赖 - 「我的」页删掉登录按钮、账号卡、四个统计格和退出登录;「关于」页删掉项目作者、致谢名单和上游宣传链接 - 本地收藏/历史与导出导入保留,删除同步专用的 lastUid 记账 取舍见 docs/decisions/0005-drop-login-and-sync.md
This commit is contained in:
@@ -48,6 +48,7 @@ export default defineConfig({
|
||||
{ text: '0002 反馈与固定 id', link: '/decisions/0002-feedback-and-ids' },
|
||||
{ text: '0003 原生 iOS 与 monorepo', link: '/decisions/0003-native-ios-monorepo' },
|
||||
{ text: '0004 只保留 Web', link: '/decisions/0004-web-only' },
|
||||
{ text: '0005 去掉登录与云同步', link: '/decisions/0005-drop-login-and-sync' },
|
||||
],
|
||||
},
|
||||
],
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
# 0004 只保留 Web,移除 Capacitor 原生壳
|
||||
|
||||
- 状态:已采纳
|
||||
- 状态:部分被 0005 取代
|
||||
- 日期:2026-10-21
|
||||
- 关联:取代 [0003 原生 iOS App 与 monorepo 结构](./0003-native-ios-monorepo)
|
||||
- 关联:取代 [0003 原生 iOS App 与 monorepo 结构](./0003-native-ios-monorepo);云乐坊 SSO 部分被 [0005 个人自用,去掉登录与云同步](./0005-drop-login-and-sync) 取代
|
||||
|
||||
## 背景
|
||||
|
||||
|
||||
@@ -0,0 +1,70 @@
|
||||
# 0005 个人自用,去掉登录与云同步
|
||||
|
||||
- 状态:已采纳
|
||||
- 日期:2026-10-22
|
||||
- 关联:[0002 反馈与固定 id](./0002-feedback-and-ids)(保留反馈链路)、[0004 只保留 Web](./0004-web-only)
|
||||
|
||||
## 背景
|
||||
|
||||
- 这份部署只给本人用,没有第二个用户,也不需要在多台设备之间来回。
|
||||
- 但登录链路一直没有停用:云乐坊 SSO 授权(`@yunlefun/sso` 0.7.0)、PKCE 顶层重定向回
|
||||
`/auth/callback`、CloudBase 会话持久化、收藏与浏览历史的云端双向同步、获客归因埋点,
|
||||
以及为支持多账号切换而写的 `lastUid` 记账。
|
||||
- 这套东西的成本不只是代码量:
|
||||
- 每次登录状态检查失败都会在「我的」页显示错误提示,而它对个人自用毫无意义;
|
||||
- 云同步失败时用户看到的是「云端同步失败,点击重试」,同样无法被单个人解决;
|
||||
- `mergeUserData` 的账号切换分支、`UserDataSyncScheduler` 的退避重试、
|
||||
`normalizeUserData` 对云端文档的信任边界,全部只为「多设备 + 多账号」存在。
|
||||
- 界面上它也占了位置:「我的」页首屏是登录按钮、账号卡和四个统计格,其中「上次同步」
|
||||
永远是空的或看不懂;「关于」页大半篇幅是项目作者、致谢名单和上游宣传链接。
|
||||
|
||||
## 方案对比
|
||||
|
||||
| 问题 | 方案 | 取舍 |
|
||||
| ------------ | ----------------------------------- | -------------------------------------------------------- |
|
||||
| 登录功能去留 | 保留登录,仅隐藏界面入口 | 入口消失,但 6 个云函数依赖、回调页和死代码仍在,误导性维护成本最高 |
|
||||
| | 保留登录 + 保留云同步 | 对单用户没有任何收益;同步失败路径无法自愈 |
|
||||
| | **完全移除登录与云同步** | 收藏/历史跨设备要手动导出导入;换来链路消失、界面清爽、无失败态 |
|
||||
|
||||
## 决定
|
||||
|
||||
### 删除
|
||||
|
||||
- 登录链路:`composables/useYunlefunAuth.ts`、`utils/yunlefunAuth.ts`、`utils/yunlefunSsoConfig.ts`、
|
||||
`adapters/yunlefunAuth.ts`、`plugins/yunlefun-auth.client.ts`、`pages/auth/callback.vue`、
|
||||
`public/.well-known/apple-app-site-association`(唯一 path 就是回调页)。
|
||||
- 云同步链路:`composables/useUserDataSync.ts`、`utils/userDataSync.ts`、`adapters/userData.ts`、
|
||||
`plugins/user-data-sync.client.ts`、`cloudfunctions/cook-user-data/`、
|
||||
`scripts/cloudbase-rules/cook_user_data.json`、`cloudbaserc.json` 里对应的函数条目。
|
||||
- 获客归因:`utils/acquisition.ts`、`plugins/acquisition.client.ts`。它只在 SSO 重定向上报,
|
||||
登录没有了就没有消费者。
|
||||
- 依赖:根与 `apps/web` 的 `@yunlefun/sso`,以及 `pnpm-workspace.yaml` 里为它开的
|
||||
`minimumReleaseAgeExclude` 例外。`@cloudbase/js-sdk` 保留(反馈仍需要)。
|
||||
- 界面:「我的」页的登录按钮、账号卡、四个统计格、退出登录;「关于」页的项目作者、致谢名单、
|
||||
网页版本、旅程的起点、前世今生。随之孤立的 `pages/about/me.vue`、
|
||||
`pages/about/acknowledgements.vue`、`components/TheAboutList.vue`、
|
||||
`constants/acknowledgements.ts` 一并删除。
|
||||
- 文案:设置页和帮助页里「登录后会自动同步」的说明改为「换设备可导出再导入」。
|
||||
|
||||
### 保留
|
||||
|
||||
- **反馈链路**:`cook-feedback` 云函数与「反馈一下」、匿名筛选信号。它本来就不强制登录,
|
||||
未登录时用随机 device id 去重限流。`callCloudbaseFunction` 从 `adapters/yunlefunAuth.ts`
|
||||
抽到新的 `adapters/cloudbase.ts`,`useRecipeFeedback` 直接调用,CloudBase 环境变量
|
||||
`yunlefunCloudbaseEnv` 保留。
|
||||
- **本地数据**:收藏、历史、自己记的菜谱照旧存在浏览器 localStorage。设置页的导出/导入
|
||||
(`exportLocalUserData` / `importLocalUserData`)是现在唯一的跨设备手段,删除墓碑
|
||||
(`favoriteRemovals` / `historyRemovals` / `historyClearedAt`)继续生效,避免导入时复活已删除的记录。
|
||||
- `utils/analytics.ts` 的 `isPrivateAnalyticsUrl`:它遮蔽 `/auth` 路径和
|
||||
`ticket` / `code` / `access_token` 等凭证参数,是通用的隐私防护,不随登录下线而删除。
|
||||
- `utils/yunleHost.ts` 与云乐坊容器(`window.ylf`)集成:这是 Web 被嵌入第三方 App 的适配层,
|
||||
与登录无关。
|
||||
|
||||
## 影响
|
||||
|
||||
- 收藏和历史不会自动跨设备。换设备或清浏览器数据前,需要在设置页导出 JSON 再导入。
|
||||
- 「我的」页不再有账号卡和同步状态,因此没有「未登录」「同步失败」这类对个人无意义的提示。
|
||||
- 云端不再有 `cook_user_data` 集合和它的读写流量。已部署的旧函数和集合需要手动在 CloudBase
|
||||
控制台删除,代码里不再维护。
|
||||
- 想要回来时:恢复 `@yunlefun/sso` 依赖和 `/auth/callback` 页面,把 `syncUserData` 与
|
||||
`UserDataLocal` 的 `readLastUid` / `writeLastUid` 接回 `store/userData.ts` 即可。
|
||||
@@ -15,4 +15,5 @@
|
||||
| [0001](./0001-recipe-data) | 菜谱数据的来源、质量与反馈闭环 | 提议中 |
|
||||
| [0002](./0002-feedback-and-ids) | 菜谱固定 id、应用内反馈与筛选信号 | 已采纳 |
|
||||
| [0003](./0003-native-ios-monorepo) | 原生 iOS App 与 monorepo 结构 | 被 0004 取代 |
|
||||
| [0004](./0004-web-only) | 只保留 Web,移除 Capacitor 原生壳 | 已采纳 |
|
||||
| [0004](./0004-web-only) | 只保留 Web,移除 Capacitor 原生壳 | 部分被 0005 取代 |
|
||||
| [0005](./0005-drop-login-and-sync) | 个人自用,去掉登录与云同步 | 已采纳 |
|
||||
|
||||
@@ -1,34 +0,0 @@
|
||||
# 注册来源记录与发布
|
||||
|
||||
Cook 在文档初次进入时记录来源。`firstTouch` 保存在当前域名的 localStorage,30 天后重新采集;`registerTouch` 保存在当前标签的 sessionStorage,每次文档进入更新。SPA 内跳页不会把原落地渠道改成站内页面。`/auth/*` 回调不采集,以免把统一登录、GitHub 或微信授权页计入获客来源。存储被禁用时,本次文档以内存降级,来源失败不会阻止登录。
|
||||
|
||||
可读存储被清空或损坏时,以当前存储状态为准,不能从旧内存恢复已删除的来源。访问存储被拒绝时使用经过校验的内存上下文;若已知新写入失败且存储仍保留完全相同的旧值,使用当前文档的新来源,防止旧活动回流。可观察的删除或值变化会清除此降级状态。首次与本次入口超过 30 天均失效,不长期保留旧活动。
|
||||
|
||||
来源只携带落地域名、路径、外部 referrer 域名以及 `utm_source`、`utm_medium`、`utm_campaign`。`yunle.fun`、其全部子域、`cook.yunyoujun.cn` 和当前域名的站内跳转不会计入外部 referrer,避免 SSO 或 Apps 往返被统计成获客渠道。查询、hash 和凭证不会写入来源记录。没有 referrer/UTM 表示来源缺失,不能据此断言为直接访问。
|
||||
|
||||
登录前读取同一份 `{ version: 1, firstTouch, registerTouch }`,同时覆盖 Web 顶层重定向和 Apps host bridge。来源为客户端上报数据;统一登录服务依据 Registry 验证应用入口并依据 Auth 判断账号是否真正新注册,不能按 Cook 首次登录或公开资料创建时间判断。后续登录不会覆盖账号已保存的注册来源。
|
||||
|
||||
## 本地联调
|
||||
|
||||
新协议在 `@yunlefun/sso@0.7.0`,正式依赖使用 npm registry 的锁定版本。需要联调尚未发布的改动时,可用本地 `YunLeFun/ylf` checkout 的实际构建/打包产物验证:
|
||||
|
||||
```sh
|
||||
node scripts/qa/verify-acquisition-sdk.mjs --sdk-root=/path/to/ylf
|
||||
# 可选:同时验证当前应用的构建与类型(包括已有工作区改动)
|
||||
node scripts/qa/verify-acquisition-sdk.mjs --sdk-root=/path/to/ylf --build --typecheck
|
||||
```
|
||||
|
||||
脚本构建 SDK 并生成临时 tarball,短暂切换已有 node_modules 的 SSO 软链接,运行定向测试和 lint,最后恢复旧软链接。它不修改 package.json、lockfile 或 pnpm override,也不发布 npm。运行时避免并发安装依赖。
|
||||
|
||||
## 发布顺序
|
||||
|
||||
1. 先发布账户私有来源集合/写入 API 与统一登录、SSO 服务端(它们可先接收可选字段并继续兼容旧客户端)。
|
||||
2. 从 `YunLeFun/ylf` 发布已验证的 `@yunlefun/sso@0.7.0`;该版本给现有 PKCE 协议增加可选来源字段。
|
||||
3. 在 Cook 解析并更新 0.7.0 的 lockfile,复核保留当前其他依赖改动,再执行 frozen install、typecheck 和构建并发布。
|
||||
4. 发布 Apps 的来源透传代码。
|
||||
|
||||
`@yunlefun/sso@0.7.0` 已由公开的 `YunLeFun/ylf` 仓库通过 OIDC 发布,附带 GitHub Actions provenance。Cook 的 lockfile 使用实际 registry integrity,安装与发布不依赖临时本地路径或 override。`minimumReleaseAgeExclude` 只为已核验的自有版本 `@yunlefun/sso@0.7.0` 提供精确例外,其余依赖继续遵循 24 小时等待和供应链策略。
|
||||
|
||||
Cook 主域名 `cook.yunyoujun.cn` 对应 EdgeOne Upload 项目 `yunyoujun-cook`,发布时使用该项目名;`cook.yunle.fun` 是另一个 Git 集成项目。云乐坊容器内的发布仍按各自流程验收。
|
||||
|
||||
历史用户最多保留来自 SSO 时间关联的应用入口推断;不能把 GA 总体流量比例回填为某个 UID 的外部渠道。各域名、不同浏览器和被清除的存储也无法恢复此前未采集的触达。
|
||||
@@ -49,6 +49,8 @@ NUXT_PUBLIC_CLARITY_DOMAINS=cook.yunyoujun.cn,cook.yunle.fun
|
||||
|
||||
直接进入 `/auth` 或携带常见凭证参数的页面时不加载脚本。已加载的页面导航到这类 URL 前调用 Clarity `stop`,并在本次文档生命周期内停止业务事件;重新加载普通页面后恢复。脚本加载或事件发送失败不会阻断 Cook 操作。
|
||||
|
||||
站点已无登录流程,`/auth` 分支保留为通用兜底:一旦将来引入带授权码的回调页,它不会被回放采集。
|
||||
|
||||
代码不调用 `identify`,也不会替访客发送“已同意”的信号。有同意管理需求的部署应连接真实的用户选择;Clarity 对 EEA、英国、瑞士的访问有同意信号要求,未提供时部分功能受限。站点隐私说明应包含实际使用的统计服务。
|
||||
|
||||
## 验收
|
||||
@@ -56,7 +58,7 @@ NUXT_PUBLIC_CLARITY_DOMAINS=cook.yunyoujun.cn,cook.yunle.fun
|
||||
1. 部署后在允许的生产域名访问首页,确认 `https://www.clarity.ms/tag/ks1ebw03i5` 只加载一次。
|
||||
2. 检查 Clarity 采集请求成功及负载中的固定事件名,再在后台录制时间线确认新漏斗事件;仪表板汇总可能延迟,HTTP 204 不代表汇总已经展示。
|
||||
3. 切换页面、选择食材、打开菜谱,验证功能正常;阻断 Clarity 域名后重复验证。
|
||||
4. 查看一条回放,确认账号和自建内容被遮罩;登录回调入口不应加载脚本。
|
||||
4. 查看一条回放,确认自建内容被遮罩;带凭证参数的 URL 不应加载脚本。
|
||||
5. 中国大陆访问效果需要用目标运营商网络实测,不能用本机可访问代替全部用户的可达性结论。
|
||||
|
||||
Clarity 官方当前提供免费服务。普通回放保留 30 天,标记或收藏的会话及热力图可保留 9 个月;单项目每日最多保存 10 万条会话回放,超过后可能抽样。它适合行为分析,不替代长期原始事件仓库。
|
||||
|
||||
+8
-12
@@ -1,6 +1,6 @@
|
||||
# Web 应用
|
||||
|
||||
Cook 只保留 Web 一套代码,服务普通浏览器和云乐坊容器。技术栈:
|
||||
Cook 只保留 Web 一套代码。技术栈:
|
||||
|
||||
- [Nuxt 4](https://nuxt.com/)(Vue 3,CSR-only,静态生成)
|
||||
- [Ionic](https://ionicframework.com/) + [Nuxt Ionic](https://ionic.nuxtjs.org/)(Web UI 框架,与 Capacitor 无关)
|
||||
@@ -8,17 +8,13 @@ Cook 只保留 Web 一套代码,服务普通浏览器和云乐坊容器。技
|
||||
|
||||
原生 App(iOS / Android)的代码已随 [0004 只保留 Web,移除 Capacitor 原生壳](/decisions/0004-web-only) 一并移除。
|
||||
|
||||
## 云乐坊 SSO
|
||||
## 没有账号体系
|
||||
|
||||
Web 端有两种登录路径:
|
||||
站点没有登录,也没有云端同步。收藏、浏览历史和自己记的菜谱都存在浏览器 localStorage,
|
||||
换设备或清浏览器数据前需要在设置页导出 JSON 再导入,详见
|
||||
[0005 个人自用,去掉登录与云同步](/decisions/0005-drop-login-and-sync)。
|
||||
|
||||
- **在云乐坊 App 容器内**:通过宿主注入的 `window.ylf` JSAPI 直接请求宿主授权面板,用户不离开当前页面。
|
||||
- **在普通浏览器中**:走顶层重定向到云乐坊授权页,授权完成后回到
|
||||
`https://cook.yunyoujun.cn/auth/callback`,由该页面换回登录票据。
|
||||
## 云乐坊容器
|
||||
|
||||
回跳地址必须是已在云乐坊登记的 HTTPS 地址,且不能带 `?platform=native` 之类的原生标记。
|
||||
PKCE 能阻止授权码被旁路窃取,但不能阻止恶意客户端主动冒充公开客户端发起授权,
|
||||
因此不要放宽回跳地址的登记要求。
|
||||
|
||||
回跳域名有多个时(`cook.yunyoujun.cn`、`cook.yunle.fun`),按当前页面 origin 选对应的那个,
|
||||
`yunlefunSsoRedirectUris` 里没登记的域名会直接判定为配置错误并拒绝登录。
|
||||
被云乐坊 App(`window.ylf` JSAPI)内嵌时会按宿主的展示形态、安全区与胶囊位置调整布局,
|
||||
实现见 `utils/yunleHost.ts`。这是 Web 被第三方 App 容器加载时的适配层,与账号无关。
|
||||
+1
-1
@@ -93,7 +93,7 @@ pnpm eval:search # 用真实信号评估当前排序:前 10 命中率、MR
|
||||
1. 在 CloudBase 控制台新建三个集合,权限都设为「仅管理端可读写」:`cook_recipe_feedback`、`cook_search_signals`、`cook_feedback_quota`。
|
||||
2. 部署云函数:`tcb fn deploy cook-feedback`(配置见 `cloudbaserc.json`)。
|
||||
3. 给 `cook-feedback` 设置环境变量 `COOK_FEEDBACK_EXPORT_TOKEN`(一串足够长的随机字符),并开启 HTTP 访问服务,得到一个访问地址。
|
||||
4. 让未登录用户也能调用 `cook-feedback`:在控制台开启匿名登录或允许未登录访问该函数。否则只有登录用户能提交,未登录用户会被引导去 GitHub。
|
||||
4. 让未登录用户也能调用 `cook-feedback`:在控制台开启匿名登录或允许未登录访问该函数。站点本身没有登录功能,前端也不携带任何账号信息,所以这一项是必需的。
|
||||
5. 本机 `.env` 填 `COOK_FEEDBACK_URL`(第 3 步的地址)和 `COOK_FEEDBACK_TOKEN`(同一个口令),之后就能 `pnpm feedback:pull`。
|
||||
|
||||
云函数对每个设备(或账号)每天最多接受 200 次提交;同一个人对同一道菜的同一类问题每天只记一次。
|
||||
|
||||
@@ -76,5 +76,5 @@ cook/
|
||||
## 下一步
|
||||
|
||||
- 📖 查看 [CLI 文档](/dev/cli) 了解数据管理
|
||||
- 💻 查看 [Web 应用开发](/dev/app) 了解技术栈与登录流程
|
||||
- 💻 查看 [Web 应用开发](/dev/app) 了解技术栈与数据存放方式
|
||||
- 🍳 开始添加你喜欢的菜谱!
|
||||
|
||||
Reference in New Issue
Block a user