Проблема с DocuSign API JWT (Python)
Кажется, у меня возникают проблемы с правильной работой аутентификации при использовании метода jwt.
Вот запрос, созданный для авторизации с приложением
uri = api_client.get_authorization_uri(
client_id = DOCUSIGN_APP_INTEGRATION_KEY,
redirect_uri = WEBHOOK_URL,
scopes = ["signature","impersonation"],
response_type = 'code',
)
uri +="&prompt=login"
И вот веб-крючок, чтобы получить токен
api_client = ApiClient(oauth_host_name = settings.DOCUSIGN_OAUTH_HOST_NAME)
# Get account id for authed user
xyz = api_client.generate_access_token(
client_id = DOCUSIGN_APP_INTEGRATION_KEY,
client_secret = DOCUSIGN_CLIENT_SECRET_KEY,
code = code,
)
resp = api_client.get_user_info(access_token = xyz.access_token)
acc_id = resp.sub
base_uri = ''
for account in resp.accounts:
if account.is_default:
base_uri = account.base_uri
break
token = api_client.request_jwt_user_token(
client_id = DOCUSIGN_APP_INTEGRATION_KEY,
user_id = acc_id,
oauth_host_name = api_client.get_oauth_host_name(),
private_key_bytes = DOCUSIGN_PRIVATE_KEY,
expires_in = 3600,
)
# Save token.access_token, and base_uri for use elsewhere
...
Я также пробовал использовать идентификатор учетной записи, найденный в resp.accounts [0] .account_id (поскольку для пользователя есть только одна учетная запись), но это не удается request_jwt_user_tokenс этой ошибкой
HTTP response body: b'{"error":"invalid_grant","error_description":"user_not_found"}
Все это работает нормально и хорошо, но затем, когда я пытаюсь создать конверт в другом месте, используя такой токен
# Setup api client with token
api_client = ApiClient()
api_client.host = api_base_path # set to https://demo.docusign.net/restapi
api_client.set_default_header("Authorization", "Bearer " + token)
envelope_api = EnvelopesApi(api_client)
try:
envelope_resp = envelope_api.create_envelope(
DOCUSIGN_API_USER_KEY,
envelope_definition=envelope_definition
)
except ApiException as e:
...
Я получаю эту ошибку
HTTP response body: b'{"errorCode":"USER_DOES_NOT_BELONG_TO_SPECIFIED_ACCOUNT","message":"The specified User is not a member of the specified Account."}'
Я также пытался использовать acc_idвместо ключа api users при создании конверта, но это дает эту ошибку:
HTTP response body: b'{"errorCode":"PARTNER_AUTHENTICATION_FAILED","message":"The specified Integrator Key was not found or is disabled. Invalid account specified for user."}'
Все это делается с помощью библиотеки, предоставленной docusign-esignдля python.
Не совсем уверен, куда идти дальше, но любая помощь приветствуется!
Ответы
Вот некоторая информация, которая может помочь.
В DocuSign у вас есть учетные записи и членство, которые являются частью учетных записей - пользователей. Итак, userId - это одно (GUID), а accountID - другое (GUID). Вы можете получить доступ к конвертам только из учетной записи, участником которой вы являетесь. при использовании JWT вы должны предоставить userId, чтобы получить токен доступа. Звонки совершаются ими, выдавая себя за этого пользователя. Если вы попытаетесь получить доступ к конверту (или чему-то еще) из учетной записи, в которой указанный пользователь не имеет членства, вы получите сообщение об ошибке.
И последнее: убедитесь, что все сделано в одном и том же формате. Это означает, что если Oauth выполняется в demo / developer (account-d.docusign.com), то вызовы API выполняются в том же env (demo.docusign.net). Если вы используете account.docusign.com (production), тогда вызовы API должны быть на правильный URL, который НЕ будет demo.docusign.net (но может быть na3.docusign.net или eu1.docusign.net и т. Д.)