ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

jose 中的 JWKInvalid 错误类:何时抛出、如何捕获与判别

jose 中的 JWKInvalid 错误类:何时抛出、如何捕获与判别 网络安全认证鉴权后端【免费下载链接】joseJWA, JWS, JWE, JWT, JWK, JWKS for Node.js, Browser, Cloudflare Workers, Deno, Bun, and other Web-interoperable runtimes项目地址https://gitcode.com/gh_mirrors/jo/jose点击查看免费下载导读本文围绕 jose 项目为 Node.js、浏览器、Cloudflare Workers、Deno、Bun 等 Web 互操作运行时提供 JWA / JWS / JWE / JWT / JWK / JWKS 支持的库中的JWKInvalid错误类展开。JWKInvalid是 jose 内置错误体系中的一员专门用于标识“JSON Web KeyJWK无效”的情况。读完本文你将掌握如何用err.code ERR_JWK_INVALID与err instanceof jose.errors.JWKInvalid两种方式识别该错误、它在整个 jose 错误体系中的位置、实际在哪些源码路径中被抛出以及如何结合AnyJOSEError可辨识联合类型做类型安全的错误处理。JWKInvalid 是什么JWKInvalid是 jose 中一个专门的Error子类语义为当传入的 JWKJSON Web Key无效时抛出。根据 JWKInvalid.md 的说明它的典型用法包括用稳定错误码code判断错误是否属于此类用instanceof判断错误类型。完整的定义位于 errors.tsexport class JWKInvalid extends JOSEError { /** ignore */ static override code: JOSEErrorCode | (string {}) ERR_JWK_INVALID /** A unique error code for {link JWKInvalid}. */ override code: JOSEErrorCode | (string {}) ERR_JWK_INVALID }它的实例上会带上一个只读稳定的code属性值为ERR_JWK_INVALID。在 jose 错误体系中的位置JWKInvalid继承自 JOSEErrorJOSEError是所有 jose 专有错误子类的公共基类Error └── JOSEError (code ERR_JOSE_GENERIC) └── JWKInvalid (code ERR_JWK_INVALID)JOSEError的构造函数会保留传入的message与options.cause并把this.name设为构造器名称errors.tsexport class JOSEError extends Error { static code: JOSEErrorCode | (string {}) ERR_JOSE_GENERIC code: JOSEErrorCode | (string {}) ERR_JOSE_GENERIC constructor(message?: string, options?: { cause?: unknown }) { super(message, options) this.name this.constructor.name ;( Error as { captureStackTrace?: (target: object, constructor?: Function) void } ).captureStackTrace?.(this, this.constructor) } }因此JWKInvalid同时具备三层可判定性err instanceof jose.errors.JWKInvalid—— 精确匹配 JWK 无效err instanceof jose.errors.JOSEError—— 匹配所有 jose 专有错误err.code—— 稳定的字符串判别。何时抛出源码中的真实触发路径在 jose 当前源码中JWKInvalid由 thumbprint.ts 抛出即JWK 指纹计算calculateJwkThumbprint/calculateJwkThumbprintUri对应 RFC 7638 与 RFC 9278 定义的指纹对入参做校验时。核心校验逻辑const check (value: unknown, description: string) { if (typeof value ! string || !value) { throw new JWKInvalid(${description} missing or invalid) } }也就是说只要 JWK 所要求的必填成员缺失undefined/null或不是非空字符串就会抛出JWKInvalid。针对不同ktyKey Type的必填成员如下thumbprint.tskty必填成员缺失时抛出的错误信息ECcrv、x、ycrv (Curve) Parameter missing or invalid等OKPcrv、xcrv (Subtype of Key Pair) Parameter missing or invalid等RSAe、ne (Exponent) Parameter missing or invalid等octkk (Key Value) Parameter missing or invalidAKPalg、pubalg (Algorithm) Parameter missing or invalid等未知kty—抛JOSENotSupportedkty (Key Type) Parameter missing or unsupported注意oct对称密钥分支是直接以显式throw new JWKInvalid(k (Key Value) Parameter missing or invalid)形式抛出的thumbprint.ts其余kty分支经由check辅助函数抛出。测试用例佐证在 thumbprint.test.ts 中有大量针对ERR_JWK_INVALID的断言例如await t.throwsAsync(calculateJwkThumbprint({ ...ec, crv: undefined }), { code: ERR_JWK_INVALID, message: crv (Curve) Parameter missing or invalid, })可见一旦ECJWK 缺crv、x或ycalculateJwkThumbprint即抛JWKInvalid错误码与信息均与文档一致。这也印证了“以code判别错误类型”是官方推荐、且被测试直接覆盖的稳定方式。如何捕获与判别方式一使用稳定错误码code原文档 给出的例子if (err.code ERR_JWK_INVALID) { // ... }code是每个JWKInvalid实例上稳定的字符串属性不受instanceof跨 realm / 多副本场景的限制适合在序列化、日志或跨运行时传递错误信息时使用。方式二使用instanceofif (err instanceof jose.errors.JWKInvalid) { // ... }JWKInvalid通过errors命名空间从主入口jose以及子路径导出jose/errors同时可用errors.ts、index.ts。因此在实际业务代码里导入方式如import { errors } from jose // 或 import { JWKInvalid } from jose/errors try { const thumbprint await calculateJwkThumbprint(badJwk) } catch (err) { if (err instanceof JWKInvalid) { // 处理无效 JWK } }方式三结合AnyJOSEError做类型收窄对于 TypeScript 用户jose 提供 AnyJOSEError 类型它是所有 jose 错误子类的联合类型并给每个子类配上唯一的code构成可辨识联合discriminated union。JWKInvalid在其中被声明为(JWKInvalid { code: ERR_JWK_INVALID })errors.ts。import { errors } from jose function handle(err: errors.AnyJOSEError) { switch (err.code) { case ERR_JWK_INVALID: // err 被收窄为 JWKInvalid break case ERR_JOSE_NOT_SUPPORTED: // ... break } }值得注意的设计细节AnyJOSEError.md 中的 NOTE基类JOSEError有意不作为AnyJOSEError的成员因为它的code覆盖了所有值会破坏判别性少数 JWKS HTTP 失败以基类本身抛出因此instanceof JOSEError仍是兜底方案。业务上常见的组合是try { // 某个可能抛 jose 错误的操作 } catch (err) { if (err instanceof jose.errors.JWKSNoMatchingKey) { // 特定错误处理 } else if (err instanceof jose.errors.JOSEError) { // 其余 jose 错误兜底 } }与其他 jose 错误类的区分JWKInvalid仅表示JWK 本身无效。jose 错误体系按对象类型划分了多个平行子类便于精确定位问题来源完整列表见 errors README错误类稳定code语义JOSEAlgNotAllowedERR_JOSE_ALG_NOT_ALLOWED算法未在开发者配置中允许JOSENotSupportedERR_JOSE_NOT_SUPPORTED特性 / 算法不受支持JWEInvalidERR_JWE_INVALIDJWE 结构无效JWEDecryptionFailedERR_JWE_DECRYPTION_FAILEDJWE 解密失败JWSInvalidERR_JWS_INVALIDJWS 结构无效JWSSignatureVerificationFailedERR_JWS_SIGNATURE_VERIFICATION_FAILED签名校验失败JWKInvalidERR_JWK_INVALIDJWK 无效JWKSInvalidERR_JWKS_INVALIDJWKS密钥集无效JWKSNoMatchingKeyERR_JWKS_NO_MATCHING_KEY密钥集中无匹配键JWKSMultipleMatchingKeysERR_JWKS_MULTIPLE_MATCHING_KEYS密钥集中多个匹配键JWKSTimeoutERR_JWKS_TIMEOUT获取 JWKS 超时JWTInvalidERR_JWT_INVALIDJWT 无效JWTClaimValidationFailedERR_JWT_CLAIM_VALIDATION_FAILEDJWT Claims 校验失败JWTExpiredERR_JWT_EXPIREDJWT 已过期完整的JOSEErrorCode字符串联合类型定义于 errors.ts。实用小结生产代码中的推荐姿势综合上文在实际业务中处理可能抛出的JWKInvalid推荐如下模式需要精确定位“JWK 无效”时优先用code判别稳定、可序列化if (err.code ERR_JWK_INVALID) { // 提示用户修复传入的 JWK }需要覆盖全部 jose 错误时用instanceof jose.errors.JOSEError兜底TypeScript 项目中利用errors.AnyJOSEErrorswitch (err.code)获得类型收窄记牢JWKInvalid的触发入口calculateJwkThumbprint/calculateJwkThumbprintUri的入参校验缺必填成员即抛——在传入 JWK 前先自行校验kty对应的必填字段可避免运行时错误。延伸阅读错误体系总览docs/util/errors/README.md基类说明JOSEError.md可辨识联合AnyJOSEError.md触发源码src/jwk/thumbprint.ts测试用例test/jwk/thumbprint.test.ts赞分享网络安全认证鉴权后端【免费下载链接】joseJWA, JWS, JWE, JWT, JWK, JWKS for Node.js, Browser, Cloudflare Workers, Deno, Bun, and other Web-interoperable runtimes项目地址https://gitcode.com/gh_mirrors/jo/jose点击查看免费下载相关推荐jose 中 JWTInvalid 错误类完全指南稳定错误码、抛出场景与实战捕获jose 中 JWTInvalid 错误类完全指南稳定错误码、抛出场景与实战捕获 导读 JWTInvalid 是 jose 库在JWT 本身格式不合法、无法网络安全认证鉴权后端V 语言 Mandelbrot WebAssembly 浏览器示例完整运行指南从 v run . 到手工编译部署V 语言 Mandelbrot WebAssembly 浏览器示例完整运行指南从 v run . 到手工编译部署 本文介绍 V 语言仓库中 examples/网络安全认证鉴权后端es-toolkit TimeoutError 完全指南超时错误的定义、抛出与捕获实践es toolkit TimeoutError 完全指南超时错误的定义、抛出与捕获实践 TimeoutError 是 es toolkit 提供的专用错误类前端后端上一篇PUBG罗技鼠标宏5分钟告别压枪难题的终极解决方案下一篇罗技PUBG压枪宏完整指南从零开始掌握自动压枪技巧创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表