Problema de JWT da API DocuSign (Python)
Parece que estou tendo problemas para fazer a autenticação funcionar corretamente ao usar o método jwt.
Aqui está a solicitação criada para autorização com o aplicativo
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"
E aqui está o webhook para obter o 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
...
Também tentei usar o ID da conta encontrado em resp.accounts [0] .account_id (já que há apenas uma conta para o usuário), mas falha request_jwt_user_tokencom este erro
HTTP response body: b'{"error":"invalid_grant","error_description":"user_not_found"}
Tudo isso funciona bem e bem, mas quando tento criar um envelope em outro lugar usando o token,
# 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:
...
Eu recebo este erro
HTTP response body: b'{"errorCode":"USER_DOES_NOT_BELONG_TO_SPECIFIED_ACCOUNT","message":"The specified User is not a member of the specified Account."}'
Também tentei usar em acc_idvez da chave de usuários da API ao criar o envelope, mas isso dá este erro:
HTTP response body: b'{"errorCode":"PARTNER_AUTHENTICATION_FAILED","message":"The specified Integrator Key was not found or is disabled. Invalid account specified for user."}'
Tudo isso é feito por meio da biblioteca fornecida docusign-esignpara python.
Não tenho certeza para onde ir a partir daqui, mas qualquer ajuda é apreciada!
Respostas
Aqui estão algumas informações que podem ajudar.
No DocuSign, você tem contas e associações que fazem parte das contas - usuários. Portanto, userId é uma coisa (GUID) e accountID é outra coisa (GUID). Você só pode acessar os envelopes de uma conta da qual você seja membro. ao usar o JWT, você deve fornecer o userId para obter o token de acesso. As chamadas são feitas fingindo ser esse usuário. Se você tentar acessar um envelope (ou qualquer coisa) de uma conta à qual o referido usuário não é membro - você obterá o erro que obteve.
Uma última coisa, certifique-se de que tudo seja feito da mesma forma Ou seja, se o Oauth é feito em demo / developer (account-d.docusign.com), as chamadas de API são feitas para o mesmo env (demo.docusign.net). Se você usar account.docusign.com (produção), as chamadas de API precisam ser para o URL correto, que NÃO será demo.docusign.net (mas pode ser na3.docusign.net ou eu1.docusign.net etc.)