TL_DR:
从https://example.com/.well-known/jwks返回的JSON中的keys数组中提取第一个key,粘贴到jwt.io页面VERIFY SIGNATURE部分的第一个文本框中。当然,example.com 是您托管 OpenIddict 身份验证服务器的域。也可以是 https://example.com/my/auth/server/ 之类的东西。
整个故事:
当您将 JWT 粘贴到 jwt.io 中时,它会执行以下操作:
- 解码令牌,并在右侧显示标头和有效负载
- 尝试验证签名
如果步骤 1. 未能解码有效负载,那是因为令牌已编码。要解决此问题,请修改 OpeIddict 配置,添加 .DisableAccessTokenEncryption();
第 2 步,签名验证,通过从 PAYLOAD 部分获取颁发者 iss 字段来完成:
并使用它作为基础 URI 来调用 /.well-known/openid-configuration,其中包括 JWKS uri,它看起来像
"jwks_uri": "https://example.com/.well-known/jwks"
jwt.io 可能无法获取此数据,例如:
- 如果您在
https://localhost 中进行测试,这无法通过 Internet 访问,就像本示例中的 https://localhost:5001 一样
- 因为请求被任何其他原因(未知域、防火墙...)拒绝
如果是这种情况,有一个解决问题的选项:将适当的字符串粘贴到VERIFY SIGNATURE部分的上部文本框中,其中有这个占位符:
SPKI、PKCS #1、X.509 证书或 JWK 字符串格式的公钥。
那里的正确字符串是什么?如果您考虑到 2 个细节,这很容易:
- 您可以从上述
https://example.com/.well-known/jwks 端点获取包含此信息的 JSON
- 返回的信息是 JWKS 字符串,但需要 JWK。
因此,调用 enpoint,获取如下所示的 JWKS:
{
"keys": [
{
"kid": "2727AC6EB83977...",
"use": "sig",
"kty": "RSA",
"alg": "RS256",
"e": "AQAB",
"n": "6tSSW3rz53Xj3w...",
"x5t": "Jyesbrg5d_2M...",
"x5c": [
"MIIC9TCCAd2gAwIBAgIJAKL..."
]
}
]
}
并提取 JWK,它只是 "keys" 数组中的第一个条目,即
{
"kid": "2727AC6EB83977...",
"use": "sig",
"kty": "RSA",
"alg": "RS256",
"e": "AQAB",
"n": "6tSSW3rz53Xj3w...",
"x5t": "Jyesbrg5d_2M...",
"x5c": [
"MIIC9TCCAd2gAwIBAgIJAKL..."
]
}
将此值粘贴到文本框中,您将收到蓝色的“签名已验证”消息,如您在第一个快照的底部所见。
注意:根据配置(AddEphemeralSigningKey()、AddDevelopmentSigningCertificate() 等),JWKS 键可以具有或多或少的属性,但无论如何它应该可以工作。