Files
mama-box/index.html
Karlcarlo 06f76b4df4 feat(身份): 同源身份缓存兜底 —— H5「返回首页」裸跳不再丢 openid/unionid (v26092212)
问题(实测孕检日历,第三方应用):页面里的「返回首页」是**页面自己发起的同源跳转**,
宿主的 <web-view src> 属性没变 → _applyIdentity() 不触发 → mama-box 的 URL 上没有身份
→ 只能显示「身份不完整」;而 retryIdentity() 只是 location.replace(自己 + 缓存戳),
同一条没有身份的 URL 重载,**永远救不回来**。而且该应用会主动把 openid/phone 从自己的
URL 上擦掉(防分享链接冒名,理由见它的注释)—— 所以那一跳**不可能**带上身份。

做法(方案已与产品确认;在架 12 个应用实测全在 mp.yizhezhe.com,同源共享 storage):
- js/wx-auth.js:新增 identity()(URL 优先 → 同源 sessionStorage 兜底,命中缓存打一条
  日志便于排查)、rememberIdentity()、goHome();并在**库载入时自动采一次**身份 ——
  接入方无需改代码,只要引了本库(孕检日历就引了,且它是绝对地址 + ETag 兜底,
  我们改库即可自动生效),宿主注入过的身份就会被存下来。
- js/app.js:hashParam() 对 openid/unionid 两键加同样的缓存回落(其余参数不受影响)。

三条纪律(写在 wx-auth.js 顶部,改前先读):
① URL 永远权威:URL 带 openid 就无条件覆盖缓存(否则切号/换人会串号);
② 只在本 origin 有效:外链应用读不到,所以「跳转要带身份」的规范不能删,缓存只兜底;
③ 只存 openid/unionid(身份键),不碰 token/手机号/昵称头像。
选 sessionStorage 而非 localStorage:同一次会话内够用,且随标签页结束即失效,暴露窗口小。

验证(本地同源:/app 模拟第三方页 + /mama-box 同一 origin):
  模拟应用页自动写缓存 → 裸跳 /mama-box/ → 提示条不显示、日志出现、按缓存身份拉数据;
  回归:无缓存且无身份 → 提示条照旧显示(fail-closed 保留);URL 带身份 → 缓存被写下且不显示提示条。
2026-09-22 21:36:52 +08:00

117 KiB