Запрашивающий Python HTTP-запрос с сертификатом Oauth1

Я использую библиотеку ответов Python, чтобы смоделировать вызов с запросами, но я получаю эту ошибку:

File "/lib/python3.5/site-packages/requests/api.py", line 110, in post
    return request('post', url, data=data, json=json, **kwargs)
  File "/lib/python3.5/site-packages/requests/api.py", line 56, in request
    return session.request(method=method, url=url, **kwargs)
  File "/lib/python3.5/site-packages/requests/sessions.py", line 474, in request
    prep = self.prepare_request(req)
  File "/lib/python3.5/site-packages/requests/sessions.py", line 407, in prepare_request
    hooks=merge_hooks(request.hooks, self.hooks),
  File "/lib/python3.5/site-packages/requests/models.py", line 306, in prepare
    self.prepare_auth(auth, url)
  File "/lib/python3.5/site-packages/requests/models.py", line 518, in prepare_auth
    r = auth(self)
  File "/lib/python3.5/site-packages/requests_oauthlib/oauth1_auth.py", line 88, in __call__
    unicode(r.url), unicode(r.method), None, r.headers)
  File "/lib/python3.5/site-packages/oauthlib/oauth1/rfc5849/__init__.py", line 313, in sign
    ('oauth_signature', self.get_oauth_signature(request)))
  File "/lib/python3.5/site-packages/oauthlib/oauth1/rfc5849/__init__.py", line 150, in get_oauth_signature
    sig = self.SIGNATURE_METHODS[self.signature_method](base_string, self)
  File "/lib/python3.5/site-packages/oauthlib/oauth1/rfc5849/signature.py", line 505, in sign_rsa_sha1_with_client
    return sign_rsa_sha1(base_string, client.rsa_key)
  File "/lib/python3.5/site-packages/oauthlib/oauth1/rfc5849/signature.py", line 497, in sign_rsa_sha1
    key = _prepare_key_plus(alg, rsa_private_key)
  File "/lib/python3.5/site-packages/oauthlib/oauth1/rfc5849/signature.py", line 574, in _prepare_key_plus
    return alg.prepare_key(keystr)
  File "/lib/python3.5/site-packages/jwt/algorithms.py", line 169, in prepare_key
    key = load_pem_public_key(key, backend=default_backend())
  File "/lib/python3.5/site-packages/cryptography/hazmat/primitives/serialization.py", line 24, in load_pem_public_key
    return backend.load_pem_public_key(data)
  File "/lib/python3.5/site-packages/cryptography/hazmat/backends/multibackend.py", line 312, in load_pem_public_key
    return b.load_pem_public_key(data)
  File "/lib/python3.5/site-packages/cryptography/hazmat/backends/openssl/backend.py", line 1074, in load_pem_public_key
    self._handle_key_loading_error()
  File "/lib/python3.5/site-packages/cryptography/hazmat/backends/openssl/backend.py", line 1289, in _handle_key_loading_error
    raise ValueError("Could not unserialize key data.")
ValueError: Could not unserialize key data

Код, который я пытаюсь смоделировать, выглядит следующим образом:

def function_to_test():
        oauth = OAuth1(
            self.consumer_key,
            client_secret=self.consumer_secret,
            resource_owner_key=self.oauth_token,
            resource_owner_secret=self.oauth_token_secret,
            rsa_key=self.rsa_key,
            signature_method=self._signature_method
        )
        return requests.post(url="https://example.com", auth=oauth, cert="/path/to/certificate")

И код тестирования:

@responses.activate
def test_token_expired(self):
    responses.add(responses.POST, url='https://example.com/',
                  body='my_expected_result',
                  status=200)
    response = function_to_test()
    self.assertEqual(response.content, 'my_expected_result)

Тест не пройден с ошибкой, показанной выше, означает ли это, что ложное срабатывание ответов не сработало? Связано ли это с параметрами auth/cert в моей request.post? Я что-то пропустил?

1 ответ

Решение

Я думаю, что ваша проблема не связана с responses библиотека, но для OAuth1 инициализация.

Прежде чем пытаться высмеять запрос, OAuth1 не удается, потому что он пытается получить доступ к ключу, который, вероятно, неправильно инициализирован в вашем тесте.

Вы можете либо дать ложное значение для этого ключа, даже издеваться над OAuth1 объект, responses затем сможет высмеять ваш звонок.

Мы могли бы ожидать responses чтобы полностью высмеивать requests вызов, но кажется, что некоторая инициализация все еще происходит до этого.

Другие вопросы по тегам