跳到主要内容
ecdsa.com
jose (JavaScript)JWT 库

错误信息

missing required "aud" claim

也可能输出为

  • missing required "iss" claim
  • missing required "exp" claim
  • missing required "sub" claim
  • missing required "iat" claim

声明名称随缺少的声明而变化(`"aud"`、`"iss"`、`"exp"`、`"sub"`、`"iat"`…)。`err.claim` 中是声明名称,`err.reason` 为 `"missing"`。

jose (JavaScript) — JWTClaimValidationFailed, code ERR_JWT_CLAIM_VALIDATION_FAILED, reason "missing"

含义

令牌中缺少一个由你的验证选项设为必需的声明。jose 不仅在你把某个声明列入 `requiredClaims` 时将其视为必需,只要你要求它检查某个声明,也会这样处理:`audience` 要求有 `aud`,`issuer` 要求有 `iss`,`subject` 要求有 `sub`,`maxTokenAge` 要求有 `iat`。引号中的声明名称会告诉你缺少的是哪一个;签名此前已经验证有效。

原因

修复方法

  1. 1.

    记录缺失的声明和已有的声明

    错误对象提供了 `claim`、`reason` 和解码后的 `payload`。记录这些信息,只需一次请求就能区分“颁发者没有写入该声明”和“发送了错误的令牌”。

    js
    import { errors, jwtVerify } from "jose";
    
    try {
      await jwtVerify(token, jwks, { algorithms: ["ES256"], audience: "https://api.example.com" });
    } catch (err) {
      if (err instanceof errors.JWTClaimValidationFailed && err.reason === "missing") {
        console.error("token lacks claim:", err.claim, "claims present:", Object.keys(err.payload));
      }
      throw err;
    }
  2. 2.

    让颁发者写入该声明

    优先修正令牌,而不是放宽验证方的要求。正是 `aud`、`iss` 和 `exp` 让 JWT 可以被安全地接受;RFC 8725 建议每个令牌都携带它们。

    js
    import { SignJWT } from "jose";
    
    const token = await new SignJWT({ scope: "orders:read" })
      .setProtectedHeader({ alg: "ES256", kid })
      .setIssuer("https://issuer.example.com")
      .setAudience("https://api.example.com")   // the claim the verifier requires
      .setIssuedAt()
      .setExpirationTime("10m")
      .sign(privateKey);

相关错误

浏览完整的签名错误库