Azure "JsonWebTokenError: invalid algorithm"

Azure "JsonWebTokenError: invalid algorithm"

集成了 API 的 Azure 静态 Web 应用程序 (SWA)。后端 API 的步骤之一是使用在请求 headers:

中提交的 public 密钥验证 Bearer Token
const jwt = require("jsonwebtoken");  // v 8.5.1
async function getMSPublicKey(misc)   // misc contains kid and tenantId, confirmed in F12 request header
{
    var vurl = "https://login.microsoftonline.com/" + misc.tenantId + "/v2.0/.well-known/openid-configuration";
    const x1 = await fetch(vurl);
    const x2 = await x1.json();
    const x3 = await fetch(x2.jwks_uri);
    const k = await x3.json();
    return pkey = k.keys.find( k => k.kid === misc.kid).x5c[0];  // public key in the entry matching kid
}

var vmisc = JSON.parse(ac.req.headers["misc"]);
var publickey = "-----BEGIN CERTIFICATE-----\n" + await getMSPublicKey(vmisc) + "\n-----END CERTIFICATE-----";

// next line is reported in AppTraces, Message = JsonWebTokenError: invalid algorithm
var payload = jwt.verify(theToken, publickey, { algorithms: ['RS256'] });
// theToken is validated ok at jwt.io

只有部署到Azure云时才会出现,本地Azure Static Web Apps模拟器都可以。

更新,我猜这是关于 Azure 云的,尤其是安全性。另一个包 Jose 上的类似结果,仅在 Azure 云上出错。

更新:找到罪魁祸首 我的原始代码是在 Authorization 名称下发送令牌。 Azure 日志显示其 read-in 长度始终为 372,而在本地模拟器中测试的长度为 1239。将其重命名为 mytoken 之类的其他名称后,一切都很好!这是无证的,提醒大家:避免sensitive/reserved字。

请检查以下步骤是否有助于解决问题:

如果您使用 public 密钥,请将 CERTIFICATE 关键字替换为 PUBLIC KEY,如果您使用私钥,请将 PRIVATE KEY 替换为 RSA PRIVATE KEY ] 如果您使用的是 RSA 私钥。

此外,问题再次出现在我们格式化 Public 键的方式中,它需要开始和结束行,并且每 64 个字符换行。

参考here了解更多信息。

这应该是无痛的,并且在你这边用更少的代码就可以工作,它处理旋转,re-fetching 键的 public,以及实现一个完整的适用的 JWK 选择算法所有已知的 JWS 算法。也不依赖于脆弱的 x5c[0] JWK 参数。

const jose = require('jose')

const JWKS = jose.createRemoteJWKSet(new URL(`https://login.microsoftonline.com/${misc.tenantId}/discovery/v2.0/keys`))

// JWKS you keep around for subsequent verifications.

const { payload, protectedHeader } = await jose.jwtVerify(jwt, JWKS)