Problema de JWT de la API de DocuSign (Python)
Parece que tengo problemas para que la autenticación funcione correctamente cuando utilizo el método jwt.
Aquí está la solicitud creada para autorizar con la aplicación
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"
Y aquí está el webhook para luego obtener el 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
...
También intenté usar la identificación de cuenta que se encontró en resp.accounts [0] .account_id (ya que solo hay una cuenta para el usuario) pero eso falla request_jwt_user_tokencon este error
HTTP response body: b'{"error":"invalid_grant","error_description":"user_not_found"}
Todo esto funciona bien y bien, pero luego, cuando intento crear un sobre en otro lugar usando el token así
# 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:
...
Recibo este error
HTTP response body: b'{"errorCode":"USER_DOES_NOT_BELONG_TO_SPECIFIED_ACCOUNT","message":"The specified User is not a member of the specified Account."}'
También intenté usar en acc_idlugar de la clave de los usuarios de la API al crear el sobre, pero eso da este error:
HTTP response body: b'{"errorCode":"PARTNER_AUTHENTICATION_FAILED","message":"The specified Integrator Key was not found or is disabled. Invalid account specified for user."}'
Todo esto se hace a través de la biblioteca provista docusign-esignpara Python.
No estoy muy seguro de a dónde ir desde aquí, ¡pero se agradece cualquier ayuda!
Respuestas
Aquí hay información que puede ayudar.
En DocuSign tiene cuentas y membresías que forman parte de las cuentas - usuarios. Entonces, un userId es una cosa (GUID) y un accountID es otra cosa (GUID). Solo puede acceder a los sobres desde una cuenta a la que sea miembro. al usar JWT, debe proporcionar el ID de usuario para obtener el token de acceso. Las llamadas se realizan haciéndose pasar por este usuario. Si intenta acceder a un sobre (o cualquier cosa) desde una cuenta a la que dicho usuario no tiene membresía, obtendrá el error que recibió.
Una última cosa, asegúrese de que todo se haga en el mismo anv. Es decir, si Oauth se realiza en demo / desarrollador (account-d.docusign.com), las llamadas a la API se realizan al mismo entorno (demo.docusign.net). Si usa account.docusign.com (producción), las llamadas a la API deben dirigirse a la URL correcta, que NO será demo.docusign.net (pero podría ser na3.docusign.net o eu1.docusign.net, etc.)