Почему PyJWT не распознает позиционный аргумент «алгоритм» при использовании метода подписи «ES256»?

#python #django #pyjwt

Вопрос:

Я использую PyJWT для создания и кодирования JWT для аутентификации токена службы уведомлений приложений Apple, для которой требуется алгоритм ES256 подписи, как указано здесь .

 self.server = settings.APNS_SERVER
self.algorithm = 'ES256'
PRIVATE_KEY = settings.APNS_PRIVATE_KEY

encoded_jwt = jwt.encode(
    {'iss': settings.TEAM_ID, 'iat': time.time()},
    PRIVATE_KEY,
    algorithm=self.algorithm,
    headers={'alg': self.algorithm, 'kid': settings.APNS_KEY_ID},
)
 

При прохождении этого пути я получаю следующую ошибку:

      encoded_jwt = jwt.encode(
   File "/usr/local/lib/python3.9/site-packages/jwt/api_jwt.py", line 63, in encode
     return api_jws.encode(json_payload, key, algorithm, headers, json_encoder)
   File "/usr/local/lib/python3.9/site-packages/jwt/api_jws.py", line 114, in encode
     signature = alg_obj.sign(signing_input, key)
   File "/usr/local/lib/python3.9/site-packages/jwt/algorithms.py", line 423, in sign
     der_sig = key.sign(msg, ec.ECDSA(self.hash_alg()))
 TypeError: sign() missing 1 required positional argument: 'algorithm'
 

Этого не происходит, когда я использую RS256 HS256 алгоритм подписи или.

Почему это происходит?

Комментарии:

1. Что это за тип PRIVATE_KEY ? Похоже, на нем вызывается метод .sign ().

2. а … просто посмотрел. это закрытый ключ RSA. это бы все объяснило, верно?

3. Да, в этом, наверное, и проблема.

Ответ №1:

Скорее всего, ваш закрытый ключ сгенерирован неправильно. Используйте эту инструкцию для создания ключа ES256: https://connect2id.com/products/nimbus-jose-jwt/openssl-key-generation