Problème JWT de l'API DocuSign (Python)

Sep 26 2020

Je semble avoir du mal à faire fonctionner correctement l'authentification lors de l'utilisation de la méthode jwt.

Voici la requête construite pour l'autorisation avec l'application

        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"       

Et voici le webhook pour ensuite obtenir le jeton

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

J'ai également essayé d'utiliser l'identifiant de compte trouvé à partir de resp.accounts [0] .account_id (puisqu'il n'y a qu'un seul compte pour l'utilisateur) mais cela échoue request_jwt_user_tokenavec cette erreur

HTTP response body: b'{"error":"invalid_grant","error_description":"user_not_found"}

Tout cela fonctionne très bien, mais quand j'essaye de créer une enveloppe ailleurs en utilisant le jeton comme ça

    # 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:
            ...                                                                                         
                            

Je reçois cette erreur

HTTP response body: b'{"errorCode":"USER_DOES_NOT_BELONG_TO_SPECIFIED_ACCOUNT","message":"The specified User is not a member of the specified Account."}'

J'ai également essayé d'utiliser à la acc_idplace de la clé des utilisateurs de l'API lors de la création de l'enveloppe, mais cela donne cette erreur:

HTTP response body: b'{"errorCode":"PARTNER_AUTHENTICATION_FAILED","message":"The specified Integrator Key was not found or is disabled. Invalid account specified for user."}'

Tout cela se fait via la bibliothèque fournie docusign-esignpour python.

Je ne sais pas trop où aller à partir d'ici, mais toute aide est appréciée!

Réponses

1 InbarGazit Sep 27 2020 at 03:25

Voici quelques informations qui peuvent vous aider.

Dans DocuSign, vous avez des comptes et des adhésions qui font partie des comptes - utilisateurs. Ainsi, un userId est une chose (GUID) et un accountID est une autre chose (GUID). Vous ne pouvez accéder aux enveloppes qu'à partir d'un compte auquel vous êtes membre. lorsque vous utilisez JWT, vous devez fournir le userId pour obtenir le jeton d'accès. Les appels sont eux effectués en se faisant passer pour cet utilisateur. Si vous essayez d'accéder à une enveloppe (ou quoi que ce soit) à partir d'un compte auquel ledit utilisateur n'est pas membre, vous obtenez l'erreur que vous avez obtenue.

Une dernière chose, veuillez vous assurer que tout est fait dans le même anv. Cela signifie que si Oauth est fait dans demo / developer (account-d.docusign.com), les appels d'API sont effectués vers le même env (demo.docusign.net). Si vous utilisez account.docusign.com (production), les appels d'API doivent être à l'URL correcte qui ne sera PAS demo.docusign.net (mais pourrait être na3.docusign.net ou eu1.docusign.net etc.)