为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
FFIVE 2022-08-01 17:15:52
我正在用Go脚本实现Google登录,并且我被困在尝试验证ID Token是否已由Google签名。具体来说,我试图在这里做第一个项目符号。我已经获得了令牌并将其拆分为标头,有效负载和签名。但我不知道如何使用Google的公钥来验证签名。我看到生成签名涉及HMACSHA256算法,但我不太清楚如何处理Google提供的JWK或PEM密钥。由于某些限制,我目前正在手动执行此操作。有谁知道我如何验证签名?
查看完整描述

1 回答

?
子衿沉夜

TA贡献1828条经验 获得超3个赞

看看 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 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

}


查看完整回答
反对 回复 2022-08-01
  • 1 回答
  • 0 关注
  • 199 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信