Problem z interfejsem JWT DocuSign API (Python)

Sep 26 2020

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

1 InbarGazit Sep 27 2020 at 03:25

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