Maison >développement back-end >Golang >Comment vérifier les signatures JWT à l'aide de JWK dans Go ?

Comment vérifier les signatures JWT à l'aide de JWK dans Go ?

Linda Hamilton
Linda Hamiltonoriginal
2024-12-28 17:00:12950parcourir

How to Verify JWT Signatures Using JWKs in Go?

Comment vérifier la signature JWT avec JWK dans Go ?

L'un des défis de l'authentification des JWT est la vérification des signatures. Cela est particulièrement vrai avec les JWK et le langage Go.

Le problème

Les décodeurs nous permettent d'analyser les JWT. Cependant, la vérification des signatures, notamment avec les JWK, présente un défi différent. Voici un exemple d'erreur courante :

type myClaims struct {
    jwt.StandardClaims
}

func main() {
    claims := &myClaims{}

    _, err := jwt.ParseWithClaims("ey...", claims, getKey)
    if err != nil {
        log.Fatal(err)
    }
}

Erreur : clé "kid" introuvable dans le jeton

La solution

Pour résoudre ce problème , nous devons fournir un Keyfunc qui récupère la clé publique. Le code suivant illustre une solution :

const jwksURL = "https://companyx.okta.com/oauth2/v1/keys"

func getKey(token *jwt.Token) (interface{}, error) {
    // TODO: Cache the response to avoid repeated HTTP requests
    set, err := jwk.FetchHTTP(jwksURL)
    if err != nil {
        return nil, err
    }
    keyID, ok := token.Header["kid"].(string)
    if !ok {
        return nil, errors.New("expecting JWT header to have string kid")
    }
    if key := set.LookupKeyID(keyID); len(key) == 1 {
        return key[0].Materialize()
    }
    return nil, fmt.Errorf("unable to find key %q", keyID)
}

Cette fonction getKey :

  1. Récupère les clés publiques à partir d'une URL fournie.
  2. Récupère l'ID de clé du En-tête JWT.
  3. Recherche la clé à l'aide de l'ID de clé.
  4. Matérialise le entrez une interface que jwt-go peut utiliser pour la vérification.

En fournissant cette fonction getKey, vous pouvez vérifier avec succès les signatures JWT à l'aide des JWK dans Go.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn