DocuSign API JWT-Problem (Python)
Ich habe anscheinend Probleme damit, dass die Authentifizierung bei Verwendung der jwt-Methode ordnungsgemäß funktioniert.
Hier ist die Anforderung zum Autorisieren mit der Anwendung
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"
Und hier ist der Webhook, um dann den Token zu bekommen
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
...
Ich habe auch versucht, die Konto-ID zu verwenden, die unter resp.accounts [0] .account_id gefunden wurde (da es nur ein Konto für den Benutzer gibt), aber das schlägt request_jwt_user_tokenmit diesem Fehler fehl
HTTP response body: b'{"error":"invalid_grant","error_description":"user_not_found"}
Das alles funktioniert gut und gut, aber wenn ich dann versuche, einen Umschlag an anderer Stelle mit dem Token so zu erstellen
# 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:
...
Ich erhalte diesen Fehler
HTTP response body: b'{"errorCode":"USER_DOES_NOT_BELONG_TO_SPECIFIED_ACCOUNT","message":"The specified User is not a member of the specified Account."}'
Ich habe auch versucht, acc_idbeim Erstellen des Umschlags anstelle des API-Benutzerschlüssels zu verwenden , aber das führt zu folgendem Fehler:
HTTP response body: b'{"errorCode":"PARTNER_AUTHENTICATION_FAILED","message":"The specified Integrator Key was not found or is disabled. Invalid account specified for user."}'
Dies geschieht alles über die docusign-esignfür Python bereitgestellte Bibliothek .
Ich bin mir nicht ganz sicher, wohin ich von hier aus gehen soll, aber jede Hilfe wird geschätzt!
Antworten
Hier sind einige Informationen, die helfen können.
In DocuSign haben Sie Konten und Mitgliedschaften, die Teil der Konten sind - Benutzer. Eine Benutzer-ID ist also eine Sache (GUID) und eine Konto-ID ist eine andere Sache (GUID). Sie können nur von einem Konto aus, auf das Sie Mitglied sind, auf Umschläge zugreifen. Wenn Sie JWT verwenden, müssen Sie die Benutzer-ID angeben, um das Zugriffstoken zu erhalten. Die Anrufe werden durch Identitätswechsel mit diesem Benutzer getätigt. Wenn Sie versuchen, von einem Konto, zu dem der Benutzer keine Mitgliedschaft hat, auf einen Umschlag (oder etwas anderes) zuzugreifen, wird der Fehler angezeigt, den Sie erhalten haben.
Eine letzte Sache, bitte stellen Sie sicher, dass alles in der gleichen Weise erledigt wird. Das heißt, wenn Oauth in Demo / Entwickler (account-d.docusign.com) ausgeführt wird, werden die API-Aufrufe an dieselbe Umgebung (demo.docusign.net) gesendet. Wenn Sie account.docusign.com (Produktion) verwenden, müssen die API-Aufrufe die richtige URL haben, die NICHT demo.docusign.net lautet (könnte aber na3.docusign.net oder eu1.docusign.net usw. sein).