Problema de JWT da API DocuSign (Python)

Sep 26 2020

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

1 InbarGazit Sep 27 2020 at 03:25

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.)