DocuSign API JWT Sự cố (Python)

Sep 26 2020

Tôi dường như đang gặp sự cố để xác thực hoạt động chính xác khi sử dụng phương thức jwt.

Đây là yêu cầu được xây dựng để ủy quyền với ứng dụng

        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"       

Và heres the webhook để sau đó nhận được mã thông báo

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

Tôi cũng đã cố gắng sử dụng id tài khoản tìm thấy từ resp.accounts [0] .account_id (Từ theres chỉ có một tài khoản cho người sử dụng) nhưng điều đó không thành công trên request_jwt_user_tokenvới lỗi này

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

Tất cả điều này đều hoạt động tốt và tốt, nhưng sau đó khi tôi cố gắng tạo một phong bì ở nơi khác bằng cách sử dụng mã thông báo như vậy

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

Tôi nhận được lỗi này

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

Tôi cũng đã cố gắng sử dụng acc_idthay vì khóa người dùng api khi tạo phong bì, nhưng điều đó gây ra lỗi này:

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

Tất cả điều này được thực hiện thông qua thư viện được cung cấp docusign-esigncho python.

Không hoàn toàn chắc chắn sẽ đi đâu từ đây, nhưng mọi sự trợ giúp đều được đánh giá cao!

Trả lời

1 InbarGazit Sep 27 2020 at 03:25

Đây là một số thông tin có thể hữu ích.

Trong DocuSign, bạn có tài khoản và tư cách thành viên là một phần của tài khoản - người dùng. Vì vậy, userId là một thứ (GUID) và accountID là một thứ khác (GUID). Bạn chỉ có thể truy cập phong bì từ tài khoản mà bạn là thành viên. khi sử dụng JWT, bạn phải cung cấp userId để lấy mã thông báo truy cập. Các cuộc gọi được họ thực hiện bằng cách mạo danh người dùng này. Nếu bạn cố gắng truy cập một phong bì (hoặc bất kỳ thứ gì) từ một tài khoản mà người dùng cho biết không có tư cách thành viên - bạn sẽ gặp phải lỗi mà mình mắc phải.

Một điều cuối cùng, hãy đảm bảo mọi thứ được thực hiện trong cùng một anv. Có nghĩa là, nếu Oauth được thực hiện trong demo / developer (account-d.docusign.com) thì các lệnh gọi API được thực hiện tới cùng một env (demo.docusign.net). Nếu bạn sử dụng account.docusign.com (production) thì các lệnh gọi API cần phải đến đúng URL sẽ KHÔNG phải là demo.docusign.net (nhưng có thể là na3.docusign.net hoặc eu1.docusign.net, v.v.)