From 74e17feed20bd650f2b04a8c8823679d7e3ffac9 Mon Sep 17 00:00:00 2001 From: deploy Date: Sat, 7 Nov 2026 01:58:20 +0000 Subject: [PATCH] =?UTF-8?q?login-gate:=20=E9=80=80=E5=87=BA=E6=A0=87?= =?UTF-8?q?=E8=AE=B0=E5=8F=AA=E5=86=99=E6=9C=AC=E6=9C=BA=E7=9C=9F=E5=AE=9E?= =?UTF-8?q?=E5=AD=98=E5=82=A8=EF=BC=88maternal-bridge=20=E9=95=9C=E5=83=8F?= =?UTF-8?q?=EF=BC=89+=20=E6=B3=A8=E9=87=8A=E6=94=B9=20auth/status=EF=BC=88?= =?UTF-8?q?=E5=8D=95=E7=8B=AC=E4=B8=8A=E6=AD=A3=E5=BC=8F=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 5.5 --- js/login-gate.js | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/js/login-gate.js b/js/login-gate.js index 20807e9..b467d01 100644 --- a/js/login-gate.js +++ b/js/login-gate.js @@ -2,7 +2,7 @@ · 退出登录 ≠ 从没授权过:后端 user_auths.loggedOut 只在点了「退出登录」时置位,重新授权清掉; 从没授权过的新用户不受影响。 · 本机标记 localStorage mmbox.out.v1 = 退出时的 openid(首屏立刻知道,不等接口); - 每次进页面再和服务器(auth/profile 的 loggedOut)对一次,对不上就改标记、重载一次。 + 每次进页面再和服务器(只读接口 auth/status 的 loggedOut,查不到不建记录)对一次,对不上就改标记、重载一次。 · 退出后:首页按访客显示(app.js 里 hashParam 不给 openid);记录、评论、点赞、收藏、投稿、 兑换、改档案这些按钮点了弹「登录后才能使用」,去登录 = 小程序授权页(没有共享库的页面回首页「我的」)。 · 后端同样拦(box_app 返回 401 needLogin),这里只是让用户别白填。 @@ -15,8 +15,19 @@ var m = ((location.hash || '') + '&' + (location.search || '')).match(new RegExp('[#?&]' + n + '=([^&#?]*)')); return m ? decodeURIComponent(m[1]) : ''; } + /* 11-07(消消乐 80d347e2 实测):maternal-bridge 会把 window.localStorage 换成落库的镜像,标记写进镜像会被同步到服务端 app_states, + 刷新首屏又读不到 → 卡在登录态。退出标记只放本机真实存储:本脚本先于 bridge 加载时当场拿住;bridge 已接管时借一个同源隐藏 iframe 的。 */ + var LS = (function () { + try { + if (!window.MaternalBridge) return window.localStorage; + var f = document.createElement('iframe'); + f.style.display = 'none'; f.setAttribute('aria-hidden', 'true'); f.src = 'about:blank'; + (document.body || document.documentElement).appendChild(f); + return f.contentWindow.localStorage; + } catch (e) { try { return window.localStorage; } catch (e2) { return null; } } + })(); var O = param('openid'), out = false; - try { out = !!O && localStorage.getItem(KEY) === O; } catch (e) {} + try { out = !!O && LS.getItem(KEY) === O; } catch (e) {} var root = document.documentElement; if (out) root.classList.add('mb-out'); @@ -25,7 +36,7 @@ openid: O, set: function (v) { G.out = !!v; - try { if (v) localStorage.setItem(KEY, O); else localStorage.removeItem(KEY); } catch (e) {} + try { if (v) LS.setItem(KEY, O); else LS.removeItem(KEY); } catch (e) {} root.classList.toggle('mb-out', !!v); }, login: function () { @@ -97,7 +108,7 @@ var REC = ['taidong', 'yunqitizhong', 'yun', 'yunqixuetang', 'gongsuopinlv', 'taierguzhong', 'chanjianrili', 'bushui'] .map(function (t) { return '#htGrid .tg[data-tool="' + t + '"]'; }).join(','); var SEL = { - home: REC + ',#vitals .vt-it,.tab-fab,.fab,.fab-w,#htEdit,.tg-add,#homeExchMod,#meExchCard,#meExchGo,#meExchOrders,#bbBanner,[data-modal="modalProfile"],[data-modal="modalWhisper"],#bfMe,.preg-card', + home: REC + ',#vitals .vt-it,.tab-fab,.fab,.fab-w,#htEdit,.tg-add,#homeExchMod,#meExchCard,#meExchGo,#meExchOrders,#bbBanner,[data-modal="modalProfile"],[data-modal="modalWhisper"],#bfMe,.preg-card,#whSay,[data-hug]', plaza: '#blk,#bfv,#csend,#cpic,#cemo,#cpOk,[data-like],[data-cl],[data-rk],#cmgo,[data-write],[data-mywrite],#tabRec', topic: '.tc-lk,.tc-go,.tc-in .pic-b,.tc-in .emo-b' };