From 43917b559ac67d3d2e8c5e2c7f0b63b5cc3be133 Mon Sep 17 00:00:00 2001 From: xcs Date: Tue, 25 Aug 2026 16:28:18 +0800 Subject: [PATCH] =?UTF-8?q?org=20adapter:=E6=94=B9=E6=AD=A3=20explainJoseE?= =?UTF-8?q?rror=20=E6=B3=A8=E9=87=8A=E9=87=8C=E7=9A=84=E7=BB=A7=E6=89=BF?= =?UTF-8?q?=E5=85=B3=E7=B3=BB=E6=8F=8F=E8=BF=B0(=E8=AF=84=E5=AE=A1=20Impor?= =?UTF-8?q?tant)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 「JWTExpired 是 JWTClaimValidationFailed 的子类」是错的 —— jose 5.10.0 里两者都 直接继承 JOSEError,implements 只是 TS 结构化类型声明,运行时不建立继承。 判在前的真实理由是让「已过期」这条更具体的话先命中,不是靠父子关系兜底 —— 错误的继承说法会给日后「简化掉」判断顺序的人一个不存在的依据。仅改注释, 两条 instanceof 分支的顺序与内容一字未动,10/10 测试原样通过。 --- .../org/internal/adapter/keycloak-token-verifier.ts | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/apps/api/src/modules/org/internal/adapter/keycloak-token-verifier.ts b/apps/api/src/modules/org/internal/adapter/keycloak-token-verifier.ts index ba475e3..06c6795 100644 --- a/apps/api/src/modules/org/internal/adapter/keycloak-token-verifier.ts +++ b/apps/api/src/modules/org/internal/adapter/keycloak-token-verifier.ts @@ -46,7 +46,12 @@ function toVerifiedClaims(claims: z.infer): VerifiedClaims }; } -/** jose 的错误 → 人话(手册 4.4)。JWTExpired 是 JWTClaimValidationFailed 的子类,先判它 */ +/** + * jose 的错误 → 人话(手册 4.4)。 + * 两者都直接继承自 `JOSEError`:类型声明上 `JWTExpired implements JWTClaimValidationFailed`, + * 但运行时**没有**继承关系(`implements` 只是结构化类型)。这里判在前不是因为父子, + * 而是要让「已过期」这条更具体的话先命中 —— 顺序是给人看的,不是给 instanceof 兜底的。 + */ export function explainJoseError(error: unknown, ctx: { readonly issuer: string; readonly audience: string }): string { if (error instanceof joseErrors.JWTExpired) return 'token 已过期,用 refresh_token 换个新的'; if (error instanceof joseErrors.JWTClaimValidationFailed) {