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)
集成了 API 的 Azure 静态 Web 应用程序 (SWA)。后端 API 的步骤之一是使用在请求 headers:
中提交的 public 密钥验证 Bearer Tokenconst 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)