"Si un ouvrier veut bien faire son travail, il doit d'abord affûter ses outils." - Confucius, "Les Entretiens de Confucius. Lu Linggong"
Page de garde > La programmation > Créer un ensemble de revendications JWT valide

Créer un ensemble de revendications JWT valide

Publié le 2024-11-04
Parcourir:752

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 y avoir quelque chose de plus avec l'échantillon qui devait changer.

Je connais les jetons Web JSON (JWT prononcés « jots ») depuis un moment, je ne les ne connais pas. 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 requête 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 valide :

{
  "iss": "https://cloud.google.com/iam",
  "sub": "projects/-/serviceAccounts/[email protected]",
  "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 : objet utilisateur du JWT, qui est l'adresse e-mail du compte de service.
  • aud : 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é. Il doit s'agir d'un nombre 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 peut être utilisé pour accéder aux ressources protégées par IAP.

Alors à propos de ce PR

Le code d'origine 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()

Cela semblait être 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, nous pouvons le faire

  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.

Déclaration de sortie Cet article est reproduit sur : https://dev.to/sigje/building-a-valid-jwt-claims-set-4l58?1 En cas de violation, veuillez contacter [email protected] pour le supprimer.
Dernier tutoriel Plus>

Clause de non-responsabilité: Toutes les ressources fournies proviennent en partie d'Internet. En cas de violation de vos droits d'auteur ou d'autres droits et intérêts, veuillez expliquer les raisons détaillées et fournir une preuve du droit d'auteur ou des droits et intérêts, puis l'envoyer à l'adresse e-mail : [email protected]. Nous nous en occuperons pour vous dans les plus brefs délais.

Copyright© 2022 湘ICP备2022001581号-3