Maison >développement back-end >Tutoriel Python >Créer un ensemble de revendications JWT valide
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.
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.
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.
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 :
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.
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!