每个开放ID服务器都需要为租户提供类似于以下的端点:
https://--YOUR DOMAIN----/.well-known/jwks.json
如果您访问此终端,您将以JSON格式看到此内容。
{
keys: [
{
alg: 'RS256',
kty: 'RSA',
use: 'sig',
n: 'tTMpnrc4dYlD8MtmPnW3xZNbLxkaGCUwTqeKB4dfLg11dEpMyQEc4JRxUvRzp9tz00r6lkZ1ixcvIiuB_eMVckU8VyFSFWBSAxp5duBk6lRpYk-QjK3kEdPxYLxyW84gNzwMi-XW8zxJbsOa-cRM9sCb62Qz2yfWoQfimoFXsCnVHq496kizO7gZ972JefvTce1_n9dd_1p0K6c14qcCXtF6hbA_gQ0N7h3IyloBqiusKyTsV-ZrMZDldZkI-4v7s49TdcRZgEOvSapMz5YyoDvAWzuWGEiljkjkCOo0Mr5Sioi2x0dBm6nJ2WVYfZrwEF5J',
e: 'AQAB',
kid: 'NTY2MjBCNzQ1RTLPQzk3NzczRRTMQ0E4NzE2MjcwOUFCRkUwRTUxNA',
x5t: 'NTY2MjBCNzQ1RTJPLzk3NzczRUNPO0E4NzE2MjcwOUFCRkUwRTUxNA',
x5c: [Array]
}
]
}
x5c是什么?
"x5c"(X.509证书链定义了公钥证书的格式和用法)头参数包含与用于数字签名JWS的密钥相对应的X.509公钥证书或证书链[RFC5280]。 证书或证书链表示为证书值字符串的JSON数组。 数组中的每个字符串都是base64编码(而不是base64url编码)的DER [ITU.X690.2008] PKIX证书值。 包含与用于数字签名JWS的密钥相对应的公钥的证书必须是第一个证书。 这可以后跟其他证书,其中每个后续证书都是用于验证前一个证书的证书。 根据RFC 5280 [RFC5280]验证证书链,并在发生任何验证失败时将证书或证书链视为无效。 使用此头参数是可选的。
如果您检查x5c数组,您会看到非常长的字符串。 您必须获取此值并为每个64个字符分隔它们。 它非常简单。 这里是一个例子:
-----BEGIN CERTIFICATE-----
MIIDBzCCAe+gAwIBAgIJY5XAn120Mst4MA0GCSqGSIb3DQEBCwUAMCExHzAdBgNV
BAMTFmRl2e11ZGlrdGt5Mi5hdXRoMC5jb20wHhcNMTkwOTI5MjAxNjE4WhcNMzMw
NjA3MjAxNjE4WjAhMR8wHQYDVQQDExZkZXYtdWe3a3RreTIuYXV0aDAuY29tMIIB
IjANBgkqhkiG9w0BAQEFAAOCAQ8AeIIBCgKCAQEAtTMpnrc4dYlD8MmPnW3xZNbL
xkaGCUwTqeKB4etLg11dEpMyQEc4JRxUvRzp9t656lkZ1ixcvIiuB/eMVckU8VyF
SFWBSAxp5vrBk6lRpYk+QjK3kEdA9PxYLxyW84gNzwMi+XW8zxJbsOa+cRM9sCb6
2Qz2fWoQfimoFXsCnVHq496kp93izO7gZ972JefvTce1/n9dd/1p0K6c14qcCXtF
6hbA/gQ0N7h3IyloBqiusKyTsV+ZrMZDldZkI+4v7s49TdcRZgEOvSapMz5YyoDv
AWzuWGEilCOo0Mr5Sioi2x0dBm6nJ2WVYfZrwEF5JTz9LlKjYAqJ6ETGYKhjkwID
AQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBQme5xBKaloQKQr5oxt
7uRlWthe6jAOBgNVHQ8BAf8EBAMCAoQwDQYJKoZIhvcNAQELBQADopEBABpfpizn
MSJ67HDX358Rav5CYFEeIBeHXrxDQLprKdNzNSxOJ6tRpk6OF0Qs52wCEbrUXYBu
MRjmmmvN3bBHGMmq/g4VPZGDLh/JF5xJjRj13um8Rfua3S2NE4nZUYfPWctk56mN
UUQ9DUkbPRbLEJKCqVSQNagk6TEGe4dfRGdUNvAzDBglMTFOSrY1GAOJdUA1+bPb
3MnSdfyIyxSfPK5oDSQ4puMWKme2ZdGGPj+urSxs1Tuwkv0DxohdV+35WUIJcJPU
ARJecLX7rjyAzqqZE1sJGfsY5ob09380/BTAwHHP/KjiOFhilJ5OoHiU62D+mEKA
DHqlJzoj1VX/3d8=
-----END CERTIFICATE-----
因此,当您开始验证过程时:
if (jwk.kid === decodedToken.header.kid){
}
此过程特定于“RS256”算法。RS256生成一个非对称签名,这意味着必须使用私钥来对JWT进行签名,并且必须使用不同的公钥来验证签名。与对称算法不同,使用RS256可以确保Auth0是JWT签名者,因为Auth0是唯一拥有私钥的一方。对于验证对称算法,您必须使用私钥。
/keys
端点)下载该密钥。看起来您正在使用对称加密,而不是公钥加密;您的sharedSecret
即为密钥。 - chrylis -cautiouslyoptimistic-