Masalah JWT DocuSign API (Python)

Sep 26 2020

Saya sepertinya mengalami kesulitan mendapatkan otentikasi agar berfungsi dengan benar saat menggunakan metode jwt.

Berikut permintaan yang dibuat untuk memberi otorisasi dengan aplikasi

        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"       

Dan inilah webhook untuk kemudian mendapatkan 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
            ...               

Saya juga mencoba menggunakan id akun yang ditemukan dari resp.accounts [0] .account_id (Karena hanya ada satu akun untuk pengguna) tetapi itu gagal request_jwt_user_tokendengan kesalahan ini

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

Ini semua berfungsi dengan baik dan baik, tetapi kemudian ketika saya mencoba membuat amplop di tempat lain menggunakan token seperti itu

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

Saya menerima kesalahan ini

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

Saya juga mencoba menggunakan acc_idalih-alih kunci pengguna api saat membuat amplop, tetapi itu memberikan kesalahan ini:

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

Ini semua dilakukan melalui pustaka yang disediakan docusign-esignuntuk python.

Tidak yakin harus pergi ke mana setelah ini, tetapi bantuan apa pun sangat kami hargai!

Jawaban

1 InbarGazit Sep 27 2020 at 03:25

Berikut beberapa informasi yang mungkin bisa membantu.

Di DocuSign Anda memiliki akun dan keanggotaan yang merupakan bagian dari akun - pengguna. Jadi, userId adalah satu hal (GUID) dan accountID adalah hal lain (GUID). Anda hanya dapat mengakses amplop dari akun tempat Anda menjadi anggota. saat menggunakan JWT, Anda harus memberikan userId untuk mendapatkan token akses. Panggilan tersebut dilakukan dengan meniru identitas pengguna ini. Jika Anda mencoba mengakses amplop (atau apa pun) dari akun yang dikatakan pengguna tidak memiliki keanggotaan - Anda mendapatkan kesalahan yang Anda dapatkan.

Satu hal lagi, pastikan semuanya dilakukan di landasan yang sama. Artinya, jika Oauth dilakukan di demo / developer (account-d.docusign.com) maka panggilan API dilakukan ke env yang sama (demo.docusign.net). Jika Anda menggunakan account.docusign.com (produksi) maka panggilan API harus ke URL yang benar yang TIDAK akan berupa demo.docusign.net (tetapi bisa jadi na3.docusign.net atau eu1.docusign.net dll.)