Maison >développement back-end >Tutoriel Python >Créer un ensemble de revendications JWT valide

Créer un ensemble de revendications JWT valide

Patricia Arquette
Patricia Arquetteoriginal
2024-09-29 11:35:301042parcourir

Building a valid JWT Claims Set

Introduction

J'avais besoin d'examiner une Pull Request qui corrigeait un problème signalé avec un échantillon et pendant que les tests passaient, j'avais l'impression qu'il devait se passer quelque chose de plus avec l'échantillon qui devait changer.

Je connais les JSON Web Tokens (JWT prononcés "jots") depuis un moment, je ne les connaît. Voir ce PR m'a donné une raison de les approfondir davantage.

Que sont les JWT

Les JWT sont une méthode standard ouverte pour transmettre en toute sécurité des informations entre les parties. Ils sont souvent utilisés pour authentifier les utilisateurs et autoriser l'accès aux ressources. Ils se composent de 3 parties : un en-tête, une charge utile et une signature.

Pourquoi avez-vous besoin de JWT

L'API IAM Service Account Credentials crée des informations d'identification de courte durée pour usurper l'identité des comptes de service IAM. La méthode signJwt signera le JWT à l'aide de la clé privée gérée par le système d'un compte de service. Dans le corps de la demande de la méthode signJwt, le champ de charge utile doit contenir un objet JSON sérialisé contenant un ensemble de revendications JWT.

Que sont les réclamations JWT

Les réclamations sont les informations de base transmises par le JWT.

Voici un exemple d'ensemble de revendications valides :

{
  "iss": "https://cloud.google.com/iam",
  "sub": "projects/-/serviceAccounts/my-service-account@my-project.iam.gserviceaccount.com",
  "aud": "https://my-iap-protected-app.example.com",
  "iat": 1694003600,
  "exp": 1694007200
}

Cet ensemble de revendications comprend les champs suivants :

  • iss : l'émetteur du JWT, le compte de service qui sera authentifié, dans ce cas doit être l'adresse e-mail du compte de service.
  • sub : Le sujet utilisateur du JWT, qui est l'e-mail du compte de service.
  • aud : l'audience du JWT, qui est l'URL de la ressource protégée par IAP.
  • iat : heure d'émission, qui correspond à l'heure à laquelle le JWT a été généré. Cela doit être un entier en UTC.
  • exp : l'heure d'expiration, qui est l'heure à laquelle le JWT ne sera plus valide. Il existe des limitations supplémentaires documentées par Cloud IAM : cela ne peut pas se produire dans le passé et pas plus de 12 heures dans le futur.

En incluant ces revendications dans la charge utile de votre JWT, vous pouvez vous assurer qu'il est valide et qu'il peut être utilisé pour accéder aux ressources protégées par IAP.

Alors à propos de ce PR

Le code original ressemblait à

    iat = datetime.datetime.now(tz=datetime.timezone.utc)
    exp = iat + 3600
    return json.dumps(
        {
            "iss": service_account_email,
            "sub": service_account_email,
            "aud": resource_url,
            "iat": iat,
            "exp": exp,
        }
    )

Je sais que quelque chose se passe avec les tests, mais je ne veux pas empêcher la résolution du problème sous-jacent avec ce code.

L'auteur du PR a soumis la modification

iat = datetime.datetime.now(tz=datetime.timezone.utc).timestamp()

Il semblait que ce serait une solution incomplète. Sur la base de la documentation de l'API, j'ai réalisé que le correctif soumis ne définirait toujours pas iat pour taper int et échouerait toujours. J'ai proposé un léger changement qui résoudrait le problème du PR de

now_utc = datetime.datetime.now(tz=datetime.timezone.utc)  
iat = int(now_utc.timestamp())

Plus j'y pensais, j'ai réalisé que Datetime n'était pas utile pour cet exemple. Le module Datetime fournit des classes pour manipuler les dates et les heures qui sont utiles lorsque vous souhaitez des dates. Nous avons littéralement besoin d'un entier en UTC donc le module Time est plus utile.

Insetad, on peut faire ça

  now = int(time.time())

    return json.dumps(
        {
            "iss": service_account_email,
            "sub": service_account_email,
            "aud": resource_url,
            "iat": now,
            "exp": now + 3600,
        }
    )

Trouvez le code complet (mis à jour !) de cet exemple ici.

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