DocuSign API JWT-Problem (Python)

Sep 26 2020

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

1 InbarGazit Sep 27 2020 at 03:25

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