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

错误信息

"alg" (Algorithm) Header Parameter value not allowed

jose (JavaScript) — JOSEAlgNotAllowed, code ERR_JOSE_ALG_NOT_ALLOWED

含义

令牌的 alg 头部指定的算法不在你传给 jwtVerify 的算法允许列表中。jose 在执行任何密码学运算之前就拒绝了它。这道关卡是有意设置的:alg 头部是攻击者可以控制的输入,必须由验证方而不是令牌来选择算法。

原因

修复方法

  1. 1.

    让允许列表、密钥与颁发者配置保持一致

    先查看头部,再让三者保持一致。迁移期间可以暂时同时接受两种算法,并通过 JWKS 中的 kid 为每种算法分配各自的密钥。

    js
    import { decodeProtectedHeader, jwtVerify } from "jose";
    
    console.log(decodeProtectedHeader(token)); // { alg: "ES256", kid: "..." }
    await jwtVerify(token, jwks, { algorithms: ["ES256"] });
  2. 2.

    尽量缩小允许列表

    不要通过列出所有算法来“修复”这个错误。每种令牌类型只允许一个值,才是安全的最终状态;RFC 8725(JWT Best Current Practices)也是这样建议的。

    js
    // good: exactly what your issuer signs with
    { algorithms: ["ES256"] }
    // bad: defeats the protection this error provides
    { algorithms: ["ES256", "RS256", "HS256", "PS256"] }

相关错误

浏览完整的签名错误库