fix: 修复 http 纯静态部署下本地账号登录不可用(issue #131)

- user_store.js:crypto.subtle 仅安全上下文可用,http://:8090 下为 undefined
  导致播种/校验静默失败;新增纯 JS SHA-256 降级实现(已对照 Node crypto
  验证一致,含非 ASCII),WebCrypto 可用时仍优先
- session.js:/auth/login 返回 5xx/非 JSON 时判定为后端不可用并降级本地
  账号,仅 4xx 视为真实鉴权失败(原逻辑把 nginx 500 HTML 误判为密码错误)
This commit is contained in:
2026-08-05 16:52:45 +08:00
parent c0af291502
commit e9787ecb22
2 changed files with 77 additions and 16 deletions
+13 -11
View File
@@ -124,18 +124,20 @@ var IAOP_SESSION = (function () {
saveSession(d.user);
return d.user;
});
// 后端在线但拒绝(401 等):是真实鉴权失败,不降级
return r.json().then(function (d) {
throw new Error((d && d.error) || "用户名或密码错误");
});
}).catch(function (e) {
if (e && e.message && e.message !== "timeout" &&
e.message !== "no backend session" &&
e.message !== "Failed to fetch" &&
e.name !== "TypeError" && !/fetch/i.test(e.message || "")) {
throw e; // 后端鉴权失败,直接抛
// 4xx = 后端在线且拒绝(真实鉴权失败);5xx/网关错误 = 后端不可用,降级本地
if (r.status >= 400 && r.status < 500) {
return r.text().then(function (t) {
var msg = "用户名或密码错误";
try { msg = (JSON.parse(t) || {}).error || msg; } catch (e) {}
var err = new Error(msg);
err.authReject = true;
throw err;
});
}
// 后端不可达 → 本地账号校验
throw new Error("backend-http-" + r.status);
}).catch(function (e) {
if (e && e.authReject) throw e; // 后端鉴权失败,不降级
// 超时 / 网络错误 / 5xx / 响应非 JSON 等一切后端不可用情形 → 本地账号校验
if (typeof UserStore === "undefined") {
throw new Error("认证服务不可用,且本地账号存储未加载");
}