如何使用 Google 的 public 密钥手动验证 JWT 的签名?
How do I manually verify the signature of a JWT using Google's public key?
我正在 Go 脚本中实现 Google 登录,但我一直在尝试验证 ID 令牌是否已由 Google 签名。
具体来说,我正在尝试做 here 中的第一个要点。
我已获得令牌并将其拆分为 header、负载和签名。但是我不知道如何使用Google的public密钥来验证签名。
我看到生成签名涉及到 ,但我不太清楚如何处理 Google 提供的 JWK 或 PEM 密钥。由于某些限制,我目前正在手动进行。
有谁知道如何验证签名吗?
查看 https://github.com/googleapis/google-api-php-client/blob/2fb6e702aca5d68203fa737f89f6f774022494c6/src/AccessToken/Verify.php#L90 上的 php 示例,
似乎 Google API 使用 RS256(RSA 签名与 SHA-256)对令牌进行签名。
以下代码应验证签名并解析令牌。
无需在您的代码中拆分令牌。
jwt.RSACheck(token []byte, key *rsa.PublicKey) (*jwt.Claims, error) 在“github.com/pascaldekloe/jwt”包中会完成所有繁重的工作为你举重。
keyLocation 是 Google public 本地存储的密钥
package main
import "github.com/pascaldekloe/jwt"
//jwtValidator verifies and parses the JWT Token
func jwtValidator(token string, keyLocation string) (j *jwtToken, err error) {
token := []byte(token)
pubK, err := rsaPublicKey(keyLocation)
if err != nil {
return
}
// parses the token only if signature is valid
claims, err := jwt.RSACheck(token, pubK)
if err != nil {
err = fmt.Errorf("token signature invalid %s", err)
return
}
if !claims.Valid(time.Now()) {
err = fmt.Errorf("token time constraints exceeded")
return
}
j = &jwtToken{
id: claims.ID,
issuer: claims.Issuer,
issued: claims.Issued,
subject: claims.Subject,
expires: claims.Expires,
}
return
}
我正在 Go 脚本中实现 Google 登录,但我一直在尝试验证 ID 令牌是否已由 Google 签名。
具体来说,我正在尝试做 here 中的第一个要点。
我已获得令牌并将其拆分为 header、负载和签名。但是我不知道如何使用Google的public密钥来验证签名。
我看到生成签名涉及到
有谁知道如何验证签名吗?
查看 https://github.com/googleapis/google-api-php-client/blob/2fb6e702aca5d68203fa737f89f6f774022494c6/src/AccessToken/Verify.php#L90 上的 php 示例, 似乎 Google API 使用 RS256(RSA 签名与 SHA-256)对令牌进行签名。
以下代码应验证签名并解析令牌。 无需在您的代码中拆分令牌。 jwt.RSACheck(token []byte, key *rsa.PublicKey) (*jwt.Claims, error) 在“github.com/pascaldekloe/jwt”包中会完成所有繁重的工作为你举重。
keyLocation 是 Google public 本地存储的密钥
package main
import "github.com/pascaldekloe/jwt"
//jwtValidator verifies and parses the JWT Token
func jwtValidator(token string, keyLocation string) (j *jwtToken, err error) {
token := []byte(token)
pubK, err := rsaPublicKey(keyLocation)
if err != nil {
return
}
// parses the token only if signature is valid
claims, err := jwt.RSACheck(token, pubK)
if err != nil {
err = fmt.Errorf("token signature invalid %s", err)
return
}
if !claims.Valid(time.Now()) {
err = fmt.Errorf("token time constraints exceeded")
return
}
j = &jwtToken{
id: claims.ID,
issuer: claims.Issuer,
issued: claims.Issued,
subject: claims.Subject,
expires: claims.Expires,
}
return
}