fix(auth): 为登录链路增加有界超时
ci / verify (pull_request) Successful in 11m22s

为 PostgreSQL 连接、就绪检查和本地登录设置分层超时,数据库不可用时返回稳定 503 错误码并记录无凭据的连接池统计。

前端登录在 10 秒后取消请求并兼容调用方 AbortSignal,Nginx 登录精确路由限制上游为 15 秒,同时更新 OpenAPI 和回归测试。
This commit is contained in:
2026-07-21 11:47:09 +08:00
parent 86c374b5c2
commit bfa17a3aba
9 changed files with 322 additions and 19 deletions
+27
View File
@@ -9,12 +9,39 @@ import {
getAPITask,
getCurrentUser,
getOpsManagementSkillMetadata,
loginLocalAccount,
OIDC_BROWSER_SESSION_CREDENTIAL,
startIdentityPairing,
retireIdentityPairingSecurityEventConflict,
validateIdentityRevision,
} from './api';
describe('local login transport', () => {
afterEach(() => {
vi.useRealTimers();
vi.unstubAllGlobals();
});
it('aborts after ten seconds and returns a stable login timeout message', async () => {
vi.useFakeTimers();
const fetchMock = vi.fn((_url: string, init?: RequestInit) => new Promise<Response>((_resolve, reject) => {
init?.signal?.addEventListener('abort', () => reject(new DOMException('aborted', 'AbortError')));
}));
vi.stubGlobal('fetch', fetchMock);
const login = loginLocalAccount({ account: 'timeout-test-account', password: 'timeout-test-password' });
const rejection = expect(login).rejects.toMatchObject({
message: '登录请求超时,请稍后重试',
});
await vi.advanceTimersByTimeAsync(10_000);
await rejection;
const [, init] = fetchMock.mock.calls[0] as [string, RequestInit];
expect(init.signal).toBeInstanceOf(AbortSignal);
expect(init.signal?.aborted).toBe(true);
});
});
describe('Gateway provisioning errors', () => {
const cases = [
['GATEWAY_USER_NOT_PROVISIONED', '该账号尚未开通 EasyAI Gateway'],