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 带身份 → 缓存被写下且不显示提示条。
This commit is contained in:
23
js/app.js
23
js/app.js
@@ -3,7 +3,7 @@
|
||||
(function () {
|
||||
'use strict';
|
||||
/* 页面版本号(YYMMDD+序号):显示在「关于兜爸心选」页底部;bump 时同步 head 注释与 ?v= */
|
||||
var VER = '26092211';
|
||||
var VER = '26092212';
|
||||
const $ = (s, c) => (c || document).querySelector(s);
|
||||
const $$ = (s, c) => Array.from((c || document).querySelectorAll(s));
|
||||
|
||||
@@ -2744,12 +2744,27 @@
|
||||
⚠️ 先在原始串上匹配、再对捕获值 decode —— 先 decode 整串会把
|
||||
%26 之类的编码提前还原成 &,破坏参数切分。
|
||||
⚠️ split('?'):历史 bug 会把缓存戳粘进 openid(abc001?t=123),
|
||||
真 openid 不含 ?,剥掉以兼容已被污染的旧链接。 */
|
||||
真 openid 不含 ?,剥掉以兼容已被污染的旧链接。 */
|
||||
try {
|
||||
const h = (location.hash.slice(1) || '') + '&' + (location.search.slice(1) || '');
|
||||
const m = h.match(new RegExp('(?:^|[&#])' + name + '=([^&#]*)'));
|
||||
return m ? decodeURIComponent(m[1]).split('?')[0] : '';
|
||||
} catch (e) { return ''; }
|
||||
const v = m ? decodeURIComponent(m[1]).split('?')[0] : '';
|
||||
if (v) return v;
|
||||
} catch (e) { /* 落到下面的兜底 */ }
|
||||
/* 身份两键(openid/unionid)URL 没带时回落**同源缓存**:
|
||||
H5 应用里「返回首页」是页面自己发起的同源跳转,宿主的 web-view src 没变、
|
||||
_applyIdentity() 不会触发,URL 上永远不会有身份(第三方应用还会主动把
|
||||
openid 从自己的 URL 上擦掉)。缓存由 wx-auth.js 的 identity() 写入 ——
|
||||
凡是引了共享库的页面(含 mama-box 自己)拿到 URL 身份时都会顺手存一份。
|
||||
纪律(URL 永远权威、只在本 origin 有效、只存 openid/unionid)见
|
||||
js/wx-auth.js 顶部那段;命中缓存时 identity() 会打一条日志便于排查。 */
|
||||
if (name === 'openid' || name === 'unionid') {
|
||||
try {
|
||||
const id = (window.wxAuth && window.wxAuth.identity) ? window.wxAuth.identity() : null;
|
||||
if (id && id[name]) return id[name];
|
||||
} catch (e) {}
|
||||
}
|
||||
return '';
|
||||
}
|
||||
/* ---------- 身份未就绪提示(2026-09-20) ----------
|
||||
宿主(小程序首页壳)拿不到 openid 时会**匿名加载**本页 —— 页面照常渲染,
|
||||
|
||||
Reference in New Issue
Block a user