„Wenn ein Arbeiter seine Arbeit gut machen will, muss er zuerst seine Werkzeuge schärfen.“ – Konfuzius, „Die Gespräche des Konfuzius. Lu Linggong“
Titelseite > Programmierung > Erstellen eines gültigen JWT-Anspruchssatzes

Erstellen eines gültigen JWT-Anspruchssatzes

Veröffentlicht am 04.11.2024
Durchsuche:288

Building a valid JWT Claims Set

Einführung

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.

Was sind JWTs?

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.

Warum brauchen Sie JWTs?

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.

Was sind JWT-Ansprüche?

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:

  • iss: Der Aussteller des JWT, das Dienstkonto, das sich authentifizieren wird, sollte in diesem Fall die E-Mail-Adresse des Dienstkontos sein.
  • sub: Der Benutzerbetreff des JWT, bei dem es sich um die E-Mail-Adresse des Dienstkontos handelt.
  • aud: Die Zielgruppe des JWT, also die URL der IAP-geschützten Ressource.
  • iat: Der ausgegebene Zeitpunkt, also der Zeitpunkt, zu dem das JWT generiert wurde. Dies muss eine Ganzzahl in UTC sein.
  • exp: Die Ablaufzeit, also der Zeitpunkt, zu dem das JWT nicht mehr gültig ist. Es gibt zusätzliche Einschränkungen, die Cloud IAM dokumentiert: dass sie nicht in der Vergangenheit und nicht mehr als 12 Stunden in der Zukunft liegen dürfen.

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.

Also zu dieser PR

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.

Freigabeerklärung Dieser Artikel ist abgedruckt unter: https://dev.to/sigje/building-a-valid-jwt-claims-set-4l58?1 Bei Verstößen wenden Sie sich bitte an [email protected], um ihn zu löschen
Neuestes Tutorial Mehr>

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