我一直在尝试在后端验证用户登录应用程序后前端应用程序收到的访问令牌。它对我的 Microsoft Entra ID 租户上的用户进行身份验证并接收访问令牌。 我通过 REST api 为 NodeJS 后端传递此访问令牌。应用程序获取令牌,使用 getSigningKey() 方法获取公钥,然后将其与令牌一起传递给 verify() 方法。 我收到“无效签名”错误,但我正在动态检索密钥并使用令牌标头中传递的 child 声明,因此我认为检索到的密钥不是问题。 这是我的代码:
`const bodyParser = require("body-parser");
const express = require("express");
const cors = require("cors");
const jwt = require("jsonwebtoken");
const jwksClient = require("jwks-rsa");
const app = express();
app.use(bodyParser.json());
app.use(cors());
app.post("/v1/teste", (req, res) => {
const entraAccessToken = req.body.token;
try {
validaTokenJwks(entraAccessToken);
} catch (err) {
console.log(`TOKEN VALIDATION GONE WRONG: ${err}`);
}
res.status(200).send("OK");
});
const options = ["RS256"];
const client = jwksClient({
jwksUri: "https://login.microsoftonline.com/common/discovery/v2.0/keys",
});
function getKey(header, callback) {
try {
client.getSigningKey(header.kid, function (err, key) {
var signingKey = key.publicKey || key.rsaPublicKey;
callback(null, signingKey);
});
} catch (error) {
console.log(error);
}
}
function validaTokenJwks(token) {
try {
jwt.verify(
token,
getKey,
{ algorithms: options, allowInvalidAsymmetricKeyTypes: false },
function (err, decoded) {
console.log(`VERIFY() ERROR: ${err}`);
console.log(`DECODED: ${decoded}`);
}
);
} catch (error) {
console.log(error);
}
}`
我尝试模拟公钥,我尝试使用 OIDC 规范提供的所有其他密钥,我记录了所有可能的输出,但仍然无法验证其签名。 我正在尝试构建一个授权服务器,第一步是验证令牌的签名以保证其完整性。
您在验证令牌签名时似乎遇到了问题。对于您的情况,请考虑使用 https://mock-api.net(一种用户友好的 API 模拟工具)来模拟来自关键端点的响应并协助您进行测试。通过为 JWKS URI 创建模拟端点,您可以控制响应并确保密钥检索过程按预期工作。这样,您就可以在受控环境中专注于解决签名验证问题。
要使用 https://mock-api.net 实现此目的,请创建一个模仿 Microsoft Entra ID 关键端点行为的模拟端点。更新您的代码以在测试期间使用此模拟 URL。这种方法可以帮助隔离问题并简化调试工作。
请随意探索 https://mock-api.net 设置模拟 JWKS 端点,如果您对其实现有任何具体问题,请告诉我。