如何使用谷歌的公钥手动验证 JWT 的签名?



我在一个Go脚本中实现谷歌登录,我被困在试图验证ID令牌已由谷歌签署。

具体来说,我要做的是第一个要点。

我已经获得了令牌并将其拆分为其标头,有效载荷和签名。但是我不知道如何使用Google的公钥来验证签名。

我看到生成签名涉及HMACSHA256算法,但我不太知道如何处理谷歌提供的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. publickey)索赔,错误)在"github.com/pascaldekloe/jwt"包裹会为你做所有繁重的工作。

keyLocation是存储在本地的Google公钥

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
}

最新更新