问题(实测孕检日历,第三方应用):页面里的「返回首页」是**页面自己发起的同源跳转**, 宿主的 <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 带身份 → 缓存被写下且不显示提示条。
117 KiB
117 KiB