#python #docusignapi
#python #docusignapi
Вопрос:
Я пытаюсь использовать «api_client.request_jwt_user_token» в DocuSign API. Но я не уверен, как преобразовать файл RSA PEM:
import rsa
from docusign_esign import ApiClient
with open('docusign.pem', mode='rb') as privatefile:
keydata = privatefile.read()
privkey = rsa.PrivateKey.load_pkcs1(keydata)
key1 = privkey.save_pkcs1(format='DER')
api_client = ApiClient()
api_client.host = 'https://demo.docusign.net/restapi'
access_token = 'eyJ0eXAiOiJKV...etc'
api_client.set_default_header('Authorization', 'Bearer '
access_token)
client_id = '2e65...etc'
user_id = 12341234
oauth_host_name = 'https://demo.docusign.net/restapi'
private_key_bytes = key1
expires_in = 28800
result = api_client.request_jwt_user_token(client_id, user_id,
oauth_host_name,
private_key_bytes,
expires_in)
Я получаю исключение Python при вызове API:
Could not deserialize key data.
Это в «site-packages/cryptography/hazmat/backends/openssl/backend.py «
Я предполагаю, что есть более простой способ получить файл RSA PEM в API.
Ссылка: https://pypi.org/project/rsa /
Обновить
Я также попытался преобразовать файл PEM с помощью openssl, а затем прочитать его вместо:
(командная строка)
$ openssl rsa -inform pem -in docusign.pem -outform der -out docusign.der
Результирующий файл имеет размер 1192 байта.
(код)
with open('docusign.der', mode='rb') as privatefile:
key1 = privatefile.read()
Что приводит к той же ошибке.
Обновление 2
Я пробовал без какого-либо преобразования ключа, а также с другой настройкой, теперь я получаю другую ошибку:
oauth_host_name = 'account-d.docusign.com'
Возвращает неверный HTTP:
Exception Value: (400)
Reason: Bad Request
HTTP response headers: HTTPHeaderDict({'Cache-Control': 'no-cache',
'Pragma': 'no-cache', 'Content-Type': 'application/json;
charset=utf-8', 'Expires': '-1', 'Server': 'Microsoft-IIS/8.5',
'X-AspNetMvc-Version': '5.2', 'X-DocuSign-TraceToken':
'666633df-ac84-4193-a282-e81075302413', 'X-Content-Type-Options':
'nosniff', 'Strict-Transport-Security': 'max-age=31536000;
includeSubDomains; preload, max-age=15768000', 'X-Frame-Options':
'SAMEORIGIN', 'X-XSS-Protection': '1; mode=block;
report=/client-errors/xss', 'X-DocuSign-Node': 'SE1DFE2', 'Date':
'Sat, 22 Aug 2020 18:53:16 GMT', 'Content-Length': '27'})
HTTP response body: b'{"error":"invalid_request"}'
Похоже, это не дает большого представления о том, что пошло не так.
Ответ №1:
В это время вы получаете закрытый ключ RSA из инструмента настройки DocuSign eSignature (ранее известного как инструмент администрирования eSignature). Используйте экран интеграции / API и ключей.
DocuSign имеет идентификатор запроса на улучшение-4714, который позволит разработчикам загружать открытый ключ своей пары ключей в DocuSign. Но в это время вы загружаете закрытый ключ из DocuSign для создания JWT.
Добавлено
К сожалению, метод request_jwt_user_token задокументирован только в исходном коде. Вот мои комментарии к вашему вызову метода:
- Для
private_key_bytes
атрибута используйте загруженный закрытый ключ в виде простой строки ASCII (с настоящими новыми строками). Другими словами, его значение должно быть примерно таким
это:
-----BEGIN RSA PRIVATE KEY-----
MIIEpAIBAAKCAQEAkbz3bi31zrH2ry4p8S4ncPoMdkUyu MG46m9BalOKzWNNAvW
1LVs5ftlXxzA6V0m6nx895w8S761/qZ8xtAAl99DezRn/3CueeBUyw tvlmEBu1C
IJK69GVoSInIKf6qyeL1WxxFV5R17QtIiQeT2yCa/fitCaxwxkNlYpP4wd5tcG0W
pNHUqbQmWywTRMIBa6yYMc9qvDTJpOubrTal3BI8VqmBww0diFWLm4l6 IZ7QvDV
Q48JYErfywNXyYTxZ4kugQcuNDR3vSuwR3KSlmiRcfhkn 2jb5rx6kKnZjXQLhg3
...
PEHgznlGh/vUboCuA4tQOcKytxFfKG4F jM/g4GH9z46KZOow3Hb6g==
-----END RSA PRIVATE KEY-----
- Максимальный срок службы токена доступа, созданного JWT, составляет 1 час, поэтому используйте 3600 для
expires_in
значения user_id
является ли guid для пользователя, который будет олицетворяться. Получите это значение либо из инструмента настройки eSignature в разделе Пользователи, либо на экране «API amp; Keys» для вашего собственного значения.- Вам нужно указать
scopes
параметр: использоватьsignature
Комментарии:
1. Хорошо, но загруженный (из DocuSign) ключ находится в формате PEM. Какой формат принимает API, вызываемый для JWT, и как мне преобразовать в этот формат?
2. Смотрите обновленный ответ. Вызову требуется формат PEM как есть.