Comment vérifier manuellement la signature d'un JWT à l'aide de la clé publique de Google?

Jan 21 2021

J'implémente la connexion Google dans un script Go et je suis bloqué en essayant de vérifier que le jeton d'identification a été signé par Google.

Plus précisément, j'essaie de faire le premier point ici .

J'ai obtenu le jeton et l'ai divisé en son en-tête, sa charge utile et sa signature. Mais je ne sais pas comment utiliser la clé publique de Google pour vérifier la signature.

J'ai vu que la génération de signature impliquait un algorithme HMACSHA256 , mais je ne sais pas trop quoi faire avec les clés JWK ou PEM fournies par Google. Je le fais actuellement manuellement en raison de certaines restrictions.

Quelqu'un sait-il comment je peux vérifier la signature s'il vous plaît?

Réponses

2 yebowhatsay Jan 21 2021 at 17:20

En regardant l'exemple php sur https://github.com/googleapis/google-api-php-client/blob/2fb6e702aca5d68203fa737f89f6f774022494c6/src/AccessToken/Verify.php#L90, il semble que Google API signe les jetons en utilisant RS256 (RSA Signature avec SHA-256).

Le code suivant doit vérifier la signature et analyser le jeton. Il n'est pas nécessaire de diviser le jeton dans votre code. jwt.RSACheck (token [] byte, key * rsa.PublicKey) (* jwt.Claims, error) dans le package "github.com/pascaldekloe/jwt" ferait tout le travail pour vous.

keyLocation est la clé publique Google stockée localement

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
}