Problem z interfejsem JWT DocuSign API (Python)
Wydaje mi się, że mam problem z poprawnym działaniem uwierzytelniania podczas korzystania z metody jwt.
Oto żądanie utworzone w celu autoryzacji w aplikacji
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"
A oto webhook, który następnie pobiera token
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
...
Próbowałem również użyć identyfikatora konta znalezionego z odpowiedniego konta [0] .account_id (ponieważ istnieje tylko jedno konto dla użytkownika), ale to kończy się niepowodzeniem request_jwt_user_tokenz tym błędem
HTTP response body: b'{"error":"invalid_grant","error_description":"user_not_found"}
To wszystko działa dobrze i dobrze, ale wtedy, gdy próbuję utworzyć kopertę w innym miejscu, używając w ten sposób tokena
# 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:
...
Otrzymuję ten błąd
HTTP response body: b'{"errorCode":"USER_DOES_NOT_BELONG_TO_SPECIFIED_ACCOUNT","message":"The specified User is not a member of the specified Account."}'
Próbowałem również użyć acc_idklucza użytkownika zamiast interfejsu API podczas tworzenia koperty, ale to powoduje ten błąd:
HTTP response body: b'{"errorCode":"PARTNER_AUTHENTICATION_FAILED","message":"The specified Integrator Key was not found or is disabled. Invalid account specified for user."}'
Wszystko to odbywa się za pośrednictwem biblioteki dostarczonej docusign-esigndla Pythona.
Nie jestem pewien, dokąd się udać, ale każda pomoc jest mile widziana!
Odpowiedzi
Oto kilka informacji, które mogą pomóc.
W DocuSign masz konta i członkostwa, które są częścią kont - użytkowników. Tak więc userId to jedno (GUID), a accountID to co innego (GUID). Możesz uzyskać dostęp do kopert tylko z konta, którego jesteś członkiem. Korzystając z JWT, należy podać identyfikator użytkownika, aby uzyskać token dostępu. Połączenia są wykonywane przez podszywanie się pod tego użytkownika. Jeśli spróbujesz uzyskać dostęp do koperty (lub czegokolwiek) z konta, do którego wspomniany użytkownik nie ma członkostwa - zostanie wyświetlony komunikat o błędzie.
I ostatnia rzecz, upewnij się, że wszystko jest zrobione w tym samym kowadle. Oznacza to, że jeśli Oauth jest wykonywany w wersji demonstracyjnej / deweloperskiej (account-d.docusign.com), wówczas wywołania API są kierowane do tego samego env (demo.docusign.net). Jeśli używasz account.docusign.com (produkcja), wtedy wywołania API muszą prowadzić do prawidłowego adresu URL, którym NIE będzie demo.docusign.net (ale może to być na3.docusign.net lub eu1.docusign.net itp.)