Problema de JWT de la API de DocuSign (Python)

Sep 26 2020

Parece que tengo problemas para que la autenticación funcione correctamente cuando utilizo el método jwt.

Aquí está la solicitud creada para autorizar con la aplicación

        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"       

Y aquí está el webhook para luego obtener el 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
            ...               

También intenté usar la identificación de cuenta que se encontró en resp.accounts [0] .account_id (ya que solo hay una cuenta para el usuario) pero eso falla request_jwt_user_tokencon este error

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

Todo esto funciona bien y bien, pero luego, cuando intento crear un sobre en otro lugar usando el token así

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

Recibo este error

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

También intenté usar en acc_idlugar de la clave de los usuarios de la API al crear el sobre, pero eso da este error:

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

Todo esto se hace a través de la biblioteca provista docusign-esignpara Python.

No estoy muy seguro de a dónde ir desde aquí, ¡pero se agradece cualquier ayuda!

Respuestas

1 InbarGazit Sep 27 2020 at 03:25

Aquí hay información que puede ayudar.

En DocuSign tiene cuentas y membresías que forman parte de las cuentas - usuarios. Entonces, un userId es una cosa (GUID) y un accountID es otra cosa (GUID). Solo puede acceder a los sobres desde una cuenta a la que sea miembro. al usar JWT, debe proporcionar el ID de usuario para obtener el token de acceso. Las llamadas se realizan haciéndose pasar por este usuario. Si intenta acceder a un sobre (o cualquier cosa) desde una cuenta a la que dicho usuario no tiene membresía, obtendrá el error que recibió.

Una última cosa, asegúrese de que todo se haga en el mismo anv. Es decir, si Oauth se realiza en demo / desarrollador (account-d.docusign.com), las llamadas a la API se realizan al mismo entorno (demo.docusign.net). Si usa account.docusign.com (producción), las llamadas a la API deben dirigirse a la URL correcta, que NO será demo.docusign.net (pero podría ser na3.docusign.net o eu1.docusign.net, etc.)