为 JWT 验证模拟一个 JWKS 端点
在 /.well-known/jwks.json 上的一个 GET 模拟(mock),以 JWK Set 格式返回一个 RSA 密钥。
JWKS 端点发布了客户端用于验证 JWT 签名的公钥。此模板在 /.well-known/jwks.json 提供一个包含一个 RSA 密钥的 JWK Set,因此您可以测试您的客户端是否获取、解析和缓存了密钥集 —— 包括当密钥 ID 缺失或轮换时它的表现如何。
代替第三方 API 端点。
响应负载
{
"keys": [
{
"kty": "RSA",
"use": "sig",
"alg": "RS256",
"kid": "quickmock-demo-2024",
"n": "n6cS6BgeHi-qEzBkR5cS-MPBwt1dG9y-tGiSTw8Uov3jMu9Yiz6Oua5dg6xKnEhP20owo6iHI_MMSjU6Sb6iKSyIskDb5myN9DHC6exkDsoKPn5tPOIbzXeV0SaF-b3BejNwakl5nfHVHFMkbLCvx9KP985_5k3b7hD1UTdBOFYLIgHWTIlUkV1L9o5DoiGMm2GYWxww3tL_ZFllp4i4yyPP6c4D_J7kgFukBBZZBGe3Ou1QvzcNUYoaRNRK1PRBsC24xSfN1oZYBd4xpg6Kp3xmpsGR2nzWCviSWbvHatFusy_NqCq2Io1EAeup_i0eIN86t2-G7rn4Uoul27BQcQ",
"e": "AQAB"
}
]
}
值得了解的字段
| 字段 | 含义 |
|---|---|
| keys | JWK Set 数组;添加更多条目以测试密钥轮换逻辑。 |
| keys.0.kid | JWT 的标头(header)为了选择此密钥而将引用的密钥 ID。 |
| keys.0.alg | 该密钥声称支持的签名算法。 |
| keys.0.n | RSA 模数,base64url 编码 —— 仅作说明之用,不是有效密钥。 |
创建模拟数据
curl -X POST https://quickmock.dev/api/mocks \
-H 'Content-Type: application/json' \
-d '{
"method": "GET",
"response_status": 200,
"content_type": "application/json",
"path_suffix": ".well-known/jwks.json",
"response_body": "{\"keys\":[{\"kty\":\"RSA\",\"use\":\"sig\",\"alg\":\"RS256\",\"kid\":\"quickmock-demo-2024\",\"n\":\"n6cS6BgeHi-qEzBkR5cS-MPBwt1dG9y-tGiSTw8Uov3jMu9Yiz6Oua5dg6xKnEhP20owo6iHI_MMSjU6Sb6iKSyIskDb5myN9DHC6exkDsoKPn5tPOIbzXeV0SaF-b3BejNwakl5nfHVHFMkbLCvx9KP985_5k3b7hD1UTdBOFYLIgHWTIlUkV1L9o5DoiGMm2GYWxww3tL_ZFllp4i4yyPP6c4D_J7kgFukBBZZBGe3Ou1QvzcNUYoaRNRK1PRBsC24xSfN1oZYBd4xpg6Kp3xmpsGR2nzWCviSWbvHatFusy_NqCq2Io1EAeup_i0eIN86t2-G7rn4Uoul27BQcQ\",\"e\":\"AQAB\"}]}"
}'
调用它
curl https://quickmock.dev/m/<slug>/.well-known/jwks.json
您将获得什么
GET /m/<slug>/.well-known/jwks.json -> 200 one RSA JWK
the key is illustrative only, it does not verify any real signature
这与真实情况有何不同
该文档中的 RSA 密钥仅为说明性质 —— Quickmock 并没有持有匹配的私钥,所以它永远无法验证真实的签名。请使用它来检查您的客户端是否正确解析了 JWKS 文档,而不是用来验证真实的令牌。
来源
常见问题解答
- 我可以使用这个密钥验证真实的令牌吗?
- 不能。该 RSA 密钥是说明性质的,没有匹配的私钥,因此没有任何东西能产生它能够验证的签名。用它来测试 JWKS 解析和缓存,而不是签名验证。
- 我如何测试密钥轮换(key rotation)?
- 向 keys 数组添加第二个具有不同 kid 的条目,然后编辑模拟以删除第一个条目。无限期缓存密钥集的客户端在删除后会持续失败 —— 这正是此测试意在暴露的错误。
- 如果令牌引用了一个未知的 kid,会发生什么?
- 正确的客户端会重新获取一次密钥集,如果密钥仍然不存在,则拒绝该令牌。提供一个缺少预期 kid 的集合,是检查您的客户端不会循环或崩溃的最干净的方法。
准备好使用了吗?
与本指南非常搭配: 模拟 REST API 端点
相关模板
最后更新: 2026-10-17