DocuSign API JWT 문제 (Python)

Sep 26 2020

jwt 방법을 사용할 때 인증이 제대로 작동하는 데 문제가있는 것 같습니다.

다음은 애플리케이션 인증을 위해 작성된 요청입니다.

        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"       

그리고 여기에 웹훅이 있습니다.

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

resp.accounts [0] .account_id (사용자 계정이 하나만 있기 때문에)에서 찾은 계정 ID를 사용해 보았지만 request_jwt_user_token이 오류로 실패합니다.

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

이것은 모두 잘 작동하지만 토큰을 사용하여 다른 곳에서 봉투를 만들려고 할 때

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

이 오류가 발생합니다.

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

또한 acc_id봉투를 만들 때 api 사용자 키 대신 사용하려고 시도했지만 이 오류가 발생합니다.

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

이것은 모두 docusign-esign파이썬 용으로 제공된 라이브러리를 통해 수행됩니다 .

여기서 어디로 가야할지 잘 모르겠지만 도움을 주시면 감사하겠습니다!

답변

1 InbarGazit Sep 27 2020 at 03:25

다음은 도움이 될 수있는 몇 가지 정보입니다.

DocuSign에는 계정의 일부인 사용자와 계정이 있습니다. 따라서 userId는 한 가지 (GUID)이고 accountID는 또 다른 것 (GUID)입니다. 회원 인 계정에서만 봉투에 액세스 할 수 있습니다. JWT를 사용할 때 액세스 토큰을 얻으려면 userId를 제공해야합니다. 이 사용자를 가장하여 호출됩니다. 해당 사용자가 멤버십이없는 계정에서 봉투 (또는 기타)에 액세스하려고하면 오류가 발생합니다.

마지막으로 모든 것이 동일한 anv에서 수행되는지 확인하십시오. 즉, 데모 / 개발자 (account-d.docusign.com)에서 Oauth가 수행되면 API 호출이 동일한 환경 (demo.docusign.net)으로 이루어집니다. account.docusign.com (프로덕션)을 사용하는 경우 API 호출은 demo.docusign.net이 아닌 올바른 URL로 이루어져야합니다 (하지만 na3.docusign.net 또는 eu1.docusign.net 등일 수 있음).