Google public 关键端点 return 是什么?
What does the Google public key endpoint return?
我在我的应用程序中使用 OpenID Connect,我从 Google 正确地获得了 JWT 令牌,我需要使用签名来验证它。
为此,我需要 public 密钥,Google 提供一个 URL,其中包含其所有 public 证书。
https://www.googleapis.com/oauth2/v3/certs
但是 returns 这个:
{
"keys": [
{
"kty": "RSA",
"alg": "RS256",
"use": "sig",
"kid": "f86c80f329b3ac69232463382fc1644167211d23",
"n": "wItpB2JpNKNgBM-xjgFbMGLYySu0SvaSA8Ag_MpqWrlWOvWvd3JQFrNKdw1nCGrGSczP6FdCRptogSEO51UB3n1h2quH-YW3NPGt0JGqXdRARJ1I1cOVq3dvrPaZhtDcEQCBAdqEmix_ngQM5vD1t8J22JO_v_JzJlTkzfYu5dPeSoXZymtgGeofdu38L1y-FlFqD09p6IP6Fxza22cv3ST3Dsw3eQ1yzGi5YuO0scTpds0jqPAslddclo22zapqB1_6qplwunpT3qAuObYR5Xn3gPseyQiwDtIk7MpEkb_AA_r4bpUGIh9-1SX3ev8urVZJ1Sg1Y_Rr-u7oQO9pdQ",
"e": "AQAB"
},
这是什么意思? public 密钥或证书在哪里?
感谢您的帮助!
这看起来像 JSON Web Key Set containing a description for an RSA public signing key. Parameters e
and n
for such keys are in turn described in JSON Web Algorithms。
除了 Pieter 的回答,您还可以在此处找到这些 RSA 密钥的 PEM X.509 证书表示:https://www.googleapis.com/oauth2/v1/certs
使用此输出,您可以构建一个 public 密钥,可用于验证 JWT。下面是link,
此处,public 密钥是使用 n 和 e 属性构建的。然后,您可以使用 JJWT 等库使用此 public 密钥验证 JWT。
您可以使用 jose 库将其转换为密钥并稍后验证签名https://github.com/panva/jose
const rsaPublicKey = await jose.importJWK({
kty: 'RSA',
e: 'AQAB',
n: '12oBZRhCiZFJLcPg59LkZZ9mdhSMTKAQZYq32k_ti5SBB6jerkh-WzOMAO664r_qyLkqHUSp3u5SbXtseZEpN3XPWGKSxjsy-1JyEFTdLSYe6f9gfrmxkUF_7DTpq0gn6rntP05g2-wFW50YO7mosfdslfrTJYWHFhJALabAeYirYD7-9kqq9ebfFMF4sRRELbv9oi36As6Q9B3Qb5_C1rAzqfao_PCsf9EPsTZsVVVkA5qoIAr47lo1ipfiBPxUCCNSdvkmDTYgvvRm6ZoMjFbvOtgyts55fXKdMWv7I9HMD5HwE9uW839PWA514qhbcIsXEYSFMPMV6fnlsiZvQQ'
}, 'PS256')
然后当你拿到publicKey
const jwt = 'eyJhbGciOiJFUzI1NiJ9.eyJ1cm46ZXhhbXBsZTpjbGFpbSI6dHJ1ZSwiaWF0IjoxNjA0MzE1MDc0LCJpc3MiOiJ1cm46ZXhhbXBsZTppc3N1ZXIiLCJhdWQiOiJ1cm46ZXhhbXBsZTphdWRpZW5jZSJ9.hx1nOfAT5LlXuzu8O-bhjXBGpklWDt2EsHw7-MDn49NrnwvVsstNhEnkW2ddauB7eSikFtUNeumLpFI9CWDBsg'
const { payload, protectedHeader } = await jose.jwtVerify(jwt, publicKey, {
issuer: 'urn:example:issuer',
audience: 'urn:example:audience'
})
console.log(protectedHeader)
console.log(payload)
请注意,此示例中的值是解释性的,它们不是实际值,您需要将算法从 PS256 更改为 RS256
我在我的应用程序中使用 OpenID Connect,我从 Google 正确地获得了 JWT 令牌,我需要使用签名来验证它。 为此,我需要 public 密钥,Google 提供一个 URL,其中包含其所有 public 证书。
https://www.googleapis.com/oauth2/v3/certs
但是 returns 这个:
{
"keys": [
{
"kty": "RSA",
"alg": "RS256",
"use": "sig",
"kid": "f86c80f329b3ac69232463382fc1644167211d23",
"n": "wItpB2JpNKNgBM-xjgFbMGLYySu0SvaSA8Ag_MpqWrlWOvWvd3JQFrNKdw1nCGrGSczP6FdCRptogSEO51UB3n1h2quH-YW3NPGt0JGqXdRARJ1I1cOVq3dvrPaZhtDcEQCBAdqEmix_ngQM5vD1t8J22JO_v_JzJlTkzfYu5dPeSoXZymtgGeofdu38L1y-FlFqD09p6IP6Fxza22cv3ST3Dsw3eQ1yzGi5YuO0scTpds0jqPAslddclo22zapqB1_6qplwunpT3qAuObYR5Xn3gPseyQiwDtIk7MpEkb_AA_r4bpUGIh9-1SX3ev8urVZJ1Sg1Y_Rr-u7oQO9pdQ",
"e": "AQAB"
},
这是什么意思? public 密钥或证书在哪里?
感谢您的帮助!
这看起来像 JSON Web Key Set containing a description for an RSA public signing key. Parameters e
and n
for such keys are in turn described in JSON Web Algorithms。
除了 Pieter 的回答,您还可以在此处找到这些 RSA 密钥的 PEM X.509 证书表示:https://www.googleapis.com/oauth2/v1/certs
使用此输出,您可以构建一个 public 密钥,可用于验证 JWT。下面是link,
此处,public 密钥是使用 n 和 e 属性构建的。然后,您可以使用 JJWT 等库使用此 public 密钥验证 JWT。
您可以使用 jose 库将其转换为密钥并稍后验证签名https://github.com/panva/jose
const rsaPublicKey = await jose.importJWK({
kty: 'RSA',
e: 'AQAB',
n: '12oBZRhCiZFJLcPg59LkZZ9mdhSMTKAQZYq32k_ti5SBB6jerkh-WzOMAO664r_qyLkqHUSp3u5SbXtseZEpN3XPWGKSxjsy-1JyEFTdLSYe6f9gfrmxkUF_7DTpq0gn6rntP05g2-wFW50YO7mosfdslfrTJYWHFhJALabAeYirYD7-9kqq9ebfFMF4sRRELbv9oi36As6Q9B3Qb5_C1rAzqfao_PCsf9EPsTZsVVVkA5qoIAr47lo1ipfiBPxUCCNSdvkmDTYgvvRm6ZoMjFbvOtgyts55fXKdMWv7I9HMD5HwE9uW839PWA514qhbcIsXEYSFMPMV6fnlsiZvQQ'
}, 'PS256')
然后当你拿到publicKey
const jwt = 'eyJhbGciOiJFUzI1NiJ9.eyJ1cm46ZXhhbXBsZTpjbGFpbSI6dHJ1ZSwiaWF0IjoxNjA0MzE1MDc0LCJpc3MiOiJ1cm46ZXhhbXBsZTppc3N1ZXIiLCJhdWQiOiJ1cm46ZXhhbXBsZTphdWRpZW5jZSJ9.hx1nOfAT5LlXuzu8O-bhjXBGpklWDt2EsHw7-MDn49NrnwvVsstNhEnkW2ddauB7eSikFtUNeumLpFI9CWDBsg'
const { payload, protectedHeader } = await jose.jwtVerify(jwt, publicKey, {
issuer: 'urn:example:issuer',
audience: 'urn:example:audience'
})
console.log(protectedHeader)
console.log(payload)
请注意,此示例中的值是解释性的,它们不是实际值,您需要将算法从 PS256 更改为 RS256