32 lines
1.4 KiB
JavaScript
32 lines
1.4 KiB
JavaScript
/* Browser identity is a random credential, never a fingerprint or a report. */
|
|
window.AccountClient = (function () {
|
|
'use strict';
|
|
var key = 'juzi.identity.v1', user = null;
|
|
function read() { try { return localStorage.getItem(key); } catch (_) { return null; } }
|
|
function request(url, data) {
|
|
return fetch(url, { credentials: 'same-origin', method: data ? 'POST' : 'GET',
|
|
headers: data ? { 'Content-Type': 'application/json' } : {},
|
|
body: data ? JSON.stringify(data) : undefined }).then(function (r) {
|
|
return r.json().then(function (v) { if (!r.ok || !v.ok) throw new Error(v.message || '请求失败'); return v; });
|
|
});
|
|
}
|
|
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; return v;
|
|
});
|
|
}
|
|
function init() {
|
|
return request('api/auth/session').then(function (v) {
|
|
user = v.user;
|
|
if (!user && 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;
|
|
});
|
|
return v;
|
|
});
|
|
}
|
|
return { request: request, init: init, browser: browser, user: function () { return user; } };
|
|
})();
|