Ich bekomme manchmal - aber nicht immer - einen Fehler von Google Identity Toolkit, der "Klartext zu groß" sagt. Es scheint in einem Abschnitt zu sein, wenn es versuchen sollte, die Signatur zu überprüfen (mit RSA). Da der SHA256-Hash der Nutzdaten verifiziert wird, sollte die Klartextgröße nicht geändert werden.Unterbrochener (aber häufiger) Google Identity Toolkit-Überprüfungsfehler: "Klartext zu groß"
Wenn ich lüge das Token, es zu benutzen versucht, und gibt, dass an den Debugger an https://jwt.io/, zusammen mit dem Google RSA-Zertifikat (von https://www.googleapis.com/identitytoolkit/v3/relyingparty/publicKeys, den Schlüssel-ID verwenden, die Puts im roten Feld oben jwt.io unter "Kind"), es sagt, dass die Unterschrift gültig ist.
Dies passiert nur ein Teil der Zeit, vielleicht etwas mehr als die Hälfte. Wenn ich die Authentifizierung wiederhole, scheint es in Ordnung zu sein.
Dies scheint nur bei neuen Authentifizierungen zu passieren; Wenn es bereits authentifiziert ist, funktioniert alles gut, obwohl ich momentan kein Session-Cookie verwende: Mein Code überprüft die gtoken-Authentifizierung bei jeder Anfrage. Sobald ich mich angemeldet habe, ist alles in Ordnung, bis ich mich abmelde (wieder über Gitkit). Aber wenn ich mich später erneut anmelde, werde ich wahrscheinlich diesen Fehler treffen.
Ich verwende App Engine für meine Infrastruktur. Dies geschieht sowohl mit dev_appserver als auch mit der bereitgestellten App Engine und mit beiden Desktop-Browsern, die die JavaScript Gitkit-Bibliothek und eine iOS-App mit der Objective C gitkit-Bibliothek verwenden. (. Ich habe nicht mit iOS gegen dev_appserver, nur in Einsatz getestet)
Der Code Ich verwende sieht wie folgt aus:
gtoken = cookie["gtoken"].value
logging.debug("Verifying Google Identity Toolkit token: %s",
gtoken)
gitkit_user = gitkit_instance.VerifyGitkitToken(gtoken)
Der Stack-Trace folgt (beginnend mit der Zeile oben zitierten):
File "/base/data/home/apps/redacted/redacted.py", line 218, in redacted:
gitkit_user = gitkit_instance.VerifyGitkitToken(gtoken)
File "/base/data/home/apps/redacted/lib/identitytoolkit/gitkitclient.py", line 266, in VerifyGitkitToken
parsed = crypt.verify_signed_jwt_with_certs(jwt, certs, aud)
File "/base/data/home/apps/redacted/lib/oauth2client/crypt.py", line 240, in verify_signed_jwt_with_certs
_verify_signature(message_to_sign, signature, certs.values())
File "/base/data/home/apps/redacted/lib/oauth2client/crypt.py", line 119, in _verify_signature
if verifier.verify(message, signature):
File "/base/data/home/apps/redacted/lib/oauth2client/_pycrypto_crypt.py", line 52, in verify
SHA256.new(message), signature)
File "/base/data/home/runtimes/python27/python27_lib/versions/third_party/pycrypto-2.6/Crypto/Signature/PKCS1_v1_5.py", line 148, in verify
m = self._key.encrypt(S, 0)[0]
File "/base/data/home/runtimes/python27/python27_lib/versions/third_party/pycrypto-2.6/Crypto/PublicKey/RSA.py", line 150, in encrypt
return pubkey.pubkey.encrypt(self, plaintext, K)
File "/base/data/home/runtimes/python27/python27_lib/versions/third_party/pycrypto-2.6/Crypto/PublicKey/pubkey.py", line 75, in encrypt
ciphertext=self._encrypt(plaintext, K)
File "/base/data/home/runtimes/python27/python27_lib/versions/third_party/pycrypto-2.6/Crypto/PublicKey/RSA.py", line 224, in _encrypt
return (self.key._encrypt(c),)
ValueError: Plaintext too large
der Fehler „Klartext zu groß“ sollte nur dann geschehen, wenn die Größe der Nutzlast, die Größe des Schlüssels RSA überschreitet. Da es einen SHA256-Hash gegen einen 2048-Bit-RSA-Schlüssel verifiziert, sollte es in Ordnung sein, also frage ich mich, ob es manchmal ein Problem mit dem Laden des Schlüssels von googleapis.com gibt. Mein nächster Schritt besteht darin, das API-Statistikmodul zu verwenden, um in den Anforderungen, in denen dies geschieht, nach urlfetch-Aufrufen zu suchen und _pycrypto_crypt.py zu erweitern, um zu protokollieren, gegen welchen RSA-Schlüssel es verifiziert werden soll. Aber ich dachte, ich würde hier bei Stack Overflow nachsehen und sehen, ob jemand diesen Weg schon gegangen ist.
Update: Mit einigen zusätzlichen Protokollierung, lernte ich ein paar Dinge. Anstatt die in den JWT-Headern angegebene Schlüssel-ID zu verwenden, iteriert die gitkit-API (oder eine der verwendeten Bibliotheken) zunächst jeden Schlüssel im Google Identity Toolkit-Keyset. Zweitens, wenn ich den Fehler in den Zeiten bekommen habe, in denen ich genug Logging hatte, hat es einen der Schlüssel getestet, der wirklich im Keyset ist, so dass meine Theorie über Probleme beim Laden der Schlüssel ungültig wird. Aber es versucht wirklich, eine 256-Byte-Zeichenfolge gegen einen 2048-Bit-Schlüssel zu überprüfen, also sollte es vollkommen in Ordnung sein.
Schließlich, obwohl es normalerweise über alle Schlüssel iteriert, in den Zeiten bekomme ich diesen Fehler, es trifft den Fehler auf den ersten Schlüssel, den es versucht. Das lässt mich fragen, ob ich in einigen Fällen schon früh einen kaputten Pycrypto importiere.
Wie Sie aus dem Backtrace sehen, verwende ich die von Google bereitgestellte pycrypto, obwohl es eine lokal kompilierte im "lib" -Verzeichnis meiner App (die in sys.path ist), die dort gespeichert wurde, wenn ich im Google Identity Toolkit bereitgestellt.
Ich habe genau das gleiche Problem auch (mit identischen Fehlermeldungen) .. alle Aktualisierungen auf, wo Sie sind in ? – Dennis
Das gleiche Problem auftritt. Hast du irgendeine Lösung gefunden? –
@SonyKadavan Ich fürchte nicht. Ich habe PyCryptoVerifier.verify Code hinzugefügt und versuche es: catch block da drin. Es wird jetzt False für einen ValueError zurückgeben, anstatt den Fehler zu verbreiten. Es scheint eine Workaround zu sein, aber ich bin nicht glücklich damit. – Piquan