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:
+13
-11
@@ -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("认证服务不可用,且本地账号存储未加载");
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user