JWT декодировать из утверждения - Google войти - PullRequest
0 голосов
/ 24 октября 2018

Я пытаюсь реализовать привязку аккаунта в Действиях в Google (используя this )

Я застрял на Обработка автоматического связывания .Я получаю assertion из запроса, когда пытаюсь декодировать его, используя python-jose библиотеку, указанную здесь !

from jose import jwt
key = "728f4016652079b9ed99861bb09bafc5a45baa86" # PUBLIC KEY OF GOOGLE from https://www.googleapis.com/oauth2/v3/certs
encoded = "ENCODED_ASSERTION"
decoded = jwt.decode(encoded, key, algorithms='RS256')
print (decoded)

при запуске этогокод, который он показывает

Traceback (most recent call last):

File "/Users/jay.patel/env372/lib/python3.7/site-packages/jose/backends/pycrypto_backend.py", line 72, in __init__
    self.prepared_key = RSA.importKey(key)
  File "/Users/jay.patel/env372/lib/python3.7/site-packages/Crypto/PublicKey/RSA.py", line 757, in import_key
    raise ValueError("RSA key format is not supported")
ValueError: RSA key format is not supported

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/Users/jay.patel/PycharmProjects/Prac/jwt.py", line 19, in <module>
    decoded = jwt.decode(encoded, key, algorithms='RS256')
  File "/Users/jay.patel/env372/lib/python3.7/site-packages/jose/jwt.py", line 135, in decode
    payload = jws.verify(token, key, algorithms, verify=verify_signature)
  File "/Users/jay.patel/env372/lib/python3.7/site-packages/jose/jws.py", line 77, in verify
    _verify_signature(signing_input, header, signature, key, algorithms)
  File "/Users/jay.patel/env372/lib/python3.7/site-packages/jose/jws.py", line 264, in _verify_signature
    if not _sig_matches_keys(keys, signing_input, signature, alg):
  File "/Users/jay.patel/env372/lib/python3.7/site-packages/jose/jws.py", line 212, in _sig_matches_keys
    key = jwk.construct(key, alg)
  File "/Users/jay.patel/env372/lib/python3.7/site-packages/jose/jwk.py", line 61, in construct
    return key_class(key_data, algorithm)
  File "/Users/jay.patel/env372/lib/python3.7/site-packages/jose/backends/pycrypto_backend.py", line 74, in __init__
    raise JWKError(e)
jose.exceptions.JWKError: RSA key format is not supported

Что я делаю не так ??Я только что использовал RS256, потому что он указан в открытых ключах Google (доступно в формате JWK или PEM )

PS Когда я пытаюсьдля декодирования утверждения здесь с алгоритмом RS256 он показывает ошибку недопустимой подписи, как показано на рисунке ниже.

enter image description here

Edit Я узнал, что передаю неправильный ключ, поэтому теперь я использую этот код для генерации открытых ключей из сертификата, но он выдаёт мне эту ошибку.

initializer for ctype 'char' must be a bytes of length 1, not int 

этомой код

from cryptography.x509 import load_pem_x509_certificate
from cryptography.hazmat.backends import default_backend

certificate_text = open('certificate.txt', 'r').read()
certBytes = list(certificate_text.encode())
certificate = load_pem_x509_certificate(certBytes, default_backend())
publicKey = certificate.public_key()

и вот так выглядит мой сертификат.txt:

-----BEGIN CERTIFICATE-----
MIIDJjCCAg6gAwIBAgIIHiSmgNCe4EIwDQYJKoZIhvcNAQEFBQAwNjE0MDIGA1UE
AxMrZmVkZXJhdGVkLXNpZ25vbi5zeXN0ZW0uZ3NlcnZpY2VhY2NvdW50LmNvbTAe
Fw0xODEwMjQxNDQ5MTFaFw0xODExMTAwMzA0MTFaMDYxNDAyBgNVBAMTK2ZlZGVy
YXRlZC1zaWdub24uc3lzdGVtLmdzZXJ2aWNlYWNjb3VudC5jb20wggEiMA0GCSqG
SIb3DQEBAQUAA4IBDwAwggEKAoIBAQCPeue6aABtdQzCrAvfWU1Vi69YZuuJPu7L
sKBN6rB80t/pD1MxCUOJ2sUVIuBJ7YGJ+MSzBLoHiqmxcyWsyhKjMjBse5KShBl1
jabm8URlGTIcHiYApm7NSLlcfktWWVu/ZMGnoqyMlZJJbkGfJ6f2kh5qYd04Ohf8
8R0GGaqScNRFG66rcFvchWe50Y/wkJsdNnzplLZpLaGlgrd4Dx2+nXnkrWMowAb1
Yfz2OGR4VHrs6r2YP7IZkNo0I3yc5lHkjLD5ZAmjn6KMQByQdefVJ1gaNCCb/Z+8
QGx/SAkSObHYOs15pxkvINQD90H0kjLlmt8VnQf2XQiRKCCBRJqRAgMBAAGjODA2
MAwGA1UdEwEB/wQCMAAwDgYDVR0PAQH/BAQDAgeAMBYGA1UdJQEB/wQMMAoGCCsG
AQUFBwMCMA0GCSqGSIb3DQEBBQUAA4IBAQAXw0JJPtxs1hanLTxSFI21ib4BDUuI
+Aksnz1azijb6cKXVJAtDMQABpH2u6VTcnnGJ/nIQ4KeJHxMDL2w6wvViz9wwRH3
lru5D6Jks8IShBSeM80IOwrfxodEfju47B+G3Zxg/1qQ4QV0S3C+oMmcqQqHFK+l
Z6glTHJrNLjH+xtiwav6jIGUhDByHiRdEOp1hYBWt7tpbeLb4Mhxyk0schaf6o47
iF3bur6WaEPUI8rUBDv0rXKS3leN3AJmmEEnRZPCoBrNDg1Esxxy/VNLHhhKRHoc
+/K4sQuHeICO1a+yetfXIO6qa3rOOxEuL9ZpWvpSDqcRbYecDqa9CiZK
-----END CERTIFICATE-----

Что я делаю не так?(Я скопировал один из сертификатов из здесь и удалил \n из него)

1 Ответ

0 голосов
/ 24 октября 2018

У вас есть несколько проблем с обработкой JWT.

Во-первых, то, что вы называете «ключом», на самом деле является «ребенком» или «идентификатором ключа».Он указывает, какой ключ из https://www.googleapis.com/oauth2/v3/certs вы должны использовать.Эти клавиши часто меняются, поэтому вам нужно время от времени извлекать их, а затем использовать «ребенок», чтобы определить, какой из них использовался для его подписи.Сам «ключ» не предоставляется, потому что это было бы небезопасно (представьте, что отправляете запертую стеклянную коробку с ключом, приклеенным к ее верхней части).

Я подозреваю, что сообщение об ошибке обманчиво.Дело не в том, что RSA не поддерживается, а в том, что формат ключа RSA, который вы указали , не поддерживается.Это имеет смысл - вы не предоставили ключ. В документации говорится, что RS256 поддерживается.Хотя нет примеров , в документации по verify() сказано, что ключом может быть JWK или JWK Set , который Google предоставляет по URL-адресу сертификатов, поэтому вам следуетв состоянии предоставить их.

Причина, по которой при ручном декодировании jwt.io подпись является недействительной, заключается в том, что ... учитывая предоставленную вами информацию, это так.Вы не дали ему открытый ключ в разделе подписи (синяя часть), который он может использовать для проверки других частей токена, поэтому он считает его недействительным.

...