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

我正在用Go脚本实现Google登录,并且我被困在尝试验证ID Token是否已由Google签名。

具体来说,我试图在这里做第一个项目符号。

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

我看到生成签名涉及HMACSHA256算法,但我不太清楚如何处理Google提供的JWK或PEM密钥。由于某些限制,我目前正在手动执行此操作。

有谁知道我如何验证签名?


FFIVE
浏览 207回答 1
1回答

子衿沉夜

看看 https://github.com/googleapis/google-api-php-client/blob/2fb6e702aca5d68203fa737f89f6f774022494c6/src/AccessToken/Verify.php#L90 上的php示例,似乎Google API使用RS256(RSA签名与SHA-256)对令牌进行签名。以下代码应验证签名并分析令牌。无需在代码中拆分令牌。新浪网.RSACheck(token []byte, key *rsa.PublicKey) (*jwt.“github.com/pascaldekloe/jwt”包中的索赔,错误)将为您完成所有繁重的工作。keyLocation是存储在本地的Google公钥package mainimport "github.com/pascaldekloe/jwt"//jwtValidator verifies and parses the JWT Tokenfunc 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}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go