feat(h5): allow guest access without login and retain history only for WeChat
This commit is contained in:
+32
-15
@@ -1,9 +1,19 @@
|
||||
/* Browser identity is a random credential, never a fingerprint or a report. */
|
||||
/* Guest access uses an ephemeral server session, never a saved browser identity. */
|
||||
window.AccountClient = (function () {
|
||||
'use strict';
|
||||
var key = 'juzi.identity.v1', kindKey = 'juzi.auth.kind.v1', user = null;
|
||||
function read(name) { try { return localStorage.getItem(name || key); } catch (_) { return null; } }
|
||||
function rememberKind() { try { if (user) localStorage.setItem(kindKey, user.kind); } catch (_) {} }
|
||||
var kindKey = 'juzi.auth.kind.v1', user = null, guestReady = false;
|
||||
function clearGuestCache() {
|
||||
try {
|
||||
localStorage.removeItem('juzi.identity.v1');
|
||||
localStorage.removeItem('juzi.reports.v1'); // Retired local guest-report cache.
|
||||
Object.keys(localStorage).filter(function (name) { return name.indexOf('juzi.profile.v1.browser.') === 0; })
|
||||
.forEach(function (name) { localStorage.removeItem(name); });
|
||||
if (localStorage.getItem(kindKey) === 'browser') localStorage.removeItem(kindKey);
|
||||
} catch (_) {}
|
||||
}
|
||||
function rememberKind() {
|
||||
try { if (user && user.kind === 'wechat') localStorage.setItem(kindKey, 'wechat'); else localStorage.removeItem(kindKey); } catch (_) {}
|
||||
}
|
||||
function request(url, data) {
|
||||
var controller = new AbortController();
|
||||
// Bound only authentication waits. Full report snapshots contain photos and
|
||||
@@ -20,24 +30,31 @@ window.AccountClient = (function () {
|
||||
}).finally(function () { clearTimeout(timer); });
|
||||
}
|
||||
function browser(consent) {
|
||||
return request('api/auth/browser', { consent: consent, token: read() }).then(function (v) {
|
||||
try { localStorage.setItem(key, v.token); } catch (_) { /* session cookie still works */ }
|
||||
user = v.user; rememberKind(); return v;
|
||||
clearGuestCache();
|
||||
return request('api/auth/browser', { consent: consent }).then(function (v) {
|
||||
user = v.user; guestReady = true; rememberKind(); return v;
|
||||
});
|
||||
}
|
||||
function guest() {
|
||||
clearGuestCache();
|
||||
user = { id: 'guest-page-' + Date.now() + '-' + Math.random().toString(36).slice(2), kind: 'browser' };
|
||||
guestReady = false; rememberKind(); return user;
|
||||
}
|
||||
function ensureGuest() {
|
||||
// The visitor entry is entirely local. Create temporary server access only
|
||||
// after explicit consent in the welcome dialog, not on entry/button tap.
|
||||
if (!user || user.kind === 'wechat' || guestReady) return Promise.resolve({ user: user });
|
||||
return browser(true);
|
||||
}
|
||||
function init(options) {
|
||||
clearGuestCache();
|
||||
return request('api/auth/session').then(function (v) {
|
||||
user = v.user;
|
||||
guestReady = !!(user && user.kind === 'browser');
|
||||
rememberKind();
|
||||
// A missing WeChat session is not permission to switch to a browser account.
|
||||
// OAuth returns must also stay explicit when its cookie was not retained.
|
||||
if (!user && !(options && options.restoreBrowser === false) && read(kindKey) !== 'wechat' && read()) return browser(true).catch(function (e) {
|
||||
// Do not replace an existing credential on a transient server/network error.
|
||||
if (/身份已失效/.test(e.message)) { try { localStorage.removeItem(key); } catch (_) {} }
|
||||
throw e;
|
||||
});
|
||||
// Never restore a guest credential or silently fall back from WeChat.
|
||||
return v;
|
||||
});
|
||||
}
|
||||
return { request: request, init: init, browser: browser, user: function () { return user; } };
|
||||
return { request: request, init: init, browser: browser, guest: guest, ensureGuest: ensureGuest, user: function () { return user; } };
|
||||
})();
|
||||
|
||||
Reference in New Issue
Block a user