Ich musste eine Pull-Anfrage überprüfen, die ein gemeldetes Problem mit einem Beispiel behebt, und während die Tests bestanden wurden, hatte ich das Gefühl, dass mit dem Beispiel noch etwas los sein musste, das geändert werden musste.
Ich kenne JSON-Web-Tokens (JWTs ausgesprochen „jots“) schon seit einiger Zeit, ich kenne sie nicht. Als ich diese PR sah, hatte ich einen Grund, mich eingehender mit ihnen zu befassen.
JWTs sind eine offene Standardmethode zur sicheren Übertragung von Informationen zwischen Parteien. Sie werden häufig zur Authentifizierung von Benutzern und zur Autorisierung des Zugriffs auf Ressourcen verwendet. Sie bestehen aus drei Teilen: einem Header, Payload und Signatur.
Die IAM Service Account Credentials API erstellt kurzlebige Anmeldeinformationen für die Nachahmung von IAM-Dienstkonten. Die signJwt-Methode signiert das JWT mit dem vom System verwalteten privaten Schlüssel eines Dienstkontos. Im Anforderungstext der signJwt-Methode sollte das Nutzlastfeld ein serialisiertes JSON-Objekt enthalten, das einen JWT-Anspruchssatz enthält.
Ansprüche sind die Kerninformationen, die das JWT übermittelt.
Hier ist ein Beispiel für einen gültigen Anspruchssatz:
{ "iss": "https://cloud.google.com/iam", "sub": "projects/-/serviceAccounts/[email protected]", "aud": "https://my-iap-protected-app.example.com", "iat": 1694003600, "exp": 1694007200 }
Dieser Anspruchssatz enthält die folgenden Felder:
Indem Sie diese Ansprüche in die Nutzlast Ihres JWT aufnehmen, können Sie sicherstellen, dass es gültig ist und für den Zugriff auf IAP-geschützte Ressourcen verwendet werden kann.
Der ursprüngliche Code sah aus wie
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, } )
Ich weiß, dass beim Testen etwas nicht stimmt, aber ich möchte nicht verhindern, dass das zugrunde liegende Problem mit diesem Code gelöst wird.
Der PR-Autor hat die Änderung eingereicht
iat = datetime.datetime.now(tz=datetime.timezone.utc).timestamp()
Dies schien eine unvollständige Lösung zu sein. Basierend auf der Dokumentation für die API wurde mir klar, dass der übermittelte Fix iat immer noch nicht auf den Typ „int“ setzen würde und trotzdem fehlschlagen würde. Ich habe eine kleine Änderung vorgeschlagen, die das PR-Problem von
lösen würde
now_utc = datetime.datetime.now(tz=datetime.timezone.utc) iat = int(now_utc.timestamp())
Je mehr ich darüber nachdachte, desto mehr wurde mir klar, dass Datetime für dieses Beispiel nicht nützlich ist. Das Datetime-Modul stellt Klassen zum Bearbeiten von Datums- und Uhrzeitangaben bereit, die nützlich sind, wenn Sie Datumsangaben wünschen. Wir benötigen buchstäblich eine Ganzzahl in UTC, damit das Zeitmodul nützlicher ist.
Insetad, wir können das tun
now = int(time.time()) return json.dumps( { "iss": service_account_email, "sub": service_account_email, "aud": resource_url, "iat": now, "exp": now 3600, } )
Den vollständigen (aktualisierten!) Code für dieses Beispiel finden Sie hier.
Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.
Copyright© 2022 湘ICP备2022001581号-3