Веб-токен JSON не может быть декодирован - PullRequest
0 голосов
/ 19 октября 2018

Я пытаюсь перенести пример начального кода GitHub Apps с Ruby на Python, но у меня возникают проблемы при создании необходимого JWT.Сценарий Ruby выглядит следующим образом и работает нормально:

require 'openssl'
require 'jwt'  # https://rubygems.org/gems/jwt

private_pem = File.read(YOUR_PATH_TO_PEM)
private_key = OpenSSL::PKey::RSA.new(private_pem)

payload = {
  iat: Time.now.to_i,
  exp: Time.now.to_i + (10 * 60),
  iss: GITHUB_APP_IDENTIFIER
}

jwt = JWT.encode(payload, private_key, "RS256")
puts jwt

Мой сценарий Python выглядит следующим образом и выдает ошибку A JSON web token could not be decoded при использовании с GitHub API:

import os
import time
import jwt

APP_IDENTIFIER = os.environ["GITHUB_APP_IDENTIFIER"]

with open('./PRIVATE_KEY.pem', 'r') as f:
    PRIVATE_KEY = f.read()

payload = {"iat": int(time.time()),
           "exp": int(time.time()) + (10*60),
           "iss": APP_IDENTIFIER}

print(jwt.encode(payload, PRIVATE_KEY, algorithm='RS256'))

Когда я попытался распечатать закрытые ключи из обоих сценариев, я обнаружил, что в версии Ruby есть дополнительный символ новой строки.Я попытался добавить это к закрытому ключу в скрипте Python, но это не изменило вывод.

Мое лучшее предположение - это то, что разница связана с вызовом OpenSSL::PKey::RSA.new, но яне уверен, что это делает с ключом.

1 Ответ

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

jwt.encode() вернет вам байты в Python 3, который, вероятно, закончится вызовом str() где-то в конвейере отправки.Вызов str() для байтовых объектов в Python 3 может привести к неожиданному поведению:

>>> a = b'hello'
>>> str(a)
"b'hello'"

Правильный способ превращения байтов в строку в Python 3 заключается в использовании:

>>> a.decode('utf-8')
'hello'

Я добавил вызов decode в конце моей строки jwt.encode, и у API внезапно возникли проблемы с декодированием JWT.

...