ปัญหา 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"       

และนี่คือ webhook เพื่อรับโทเค็น

            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 ด้วย (เนื่องจากมีเพียงบัญชีเดียวสำหรับผู้ใช้) แต่ก็ล้มเหลว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ไว้สำหรับ python

ไม่ค่อยแน่ใจว่าจะไปที่ไหนจากที่นี่ แต่ขอขอบคุณความช่วยเหลือใด ๆ !

คำตอบ

1 InbarGazit Sep 27 2020 at 03:25

นี่คือข้อมูลบางส่วนที่อาจช่วยได้

ใน DocuSign คุณมีบัญชีและการเป็นสมาชิกที่เป็นส่วนหนึ่งของบัญชี - ผู้ใช้ ดังนั้น userId คือสิ่งหนึ่ง (GUID) และ accountID ก็เป็นอีกสิ่งหนึ่ง (GUID) คุณสามารถเข้าถึงซองจดหมายจากบัญชีที่คุณเป็นสมาชิกเท่านั้น เมื่อใช้ JWT คุณต้องระบุ userId เพื่อรับโทเค็นการเข้าถึง การโทรนั้นเกิดจากการแอบอ้างเป็นผู้ใช้รายนี้ หากคุณพยายามเข้าถึงซองจดหมาย (หรืออะไรก็ได้) จากบัญชีที่ผู้ใช้ดังกล่าวไม่มีการเป็นสมาชิกคุณจะได้รับข้อผิดพลาดที่คุณได้รับ

สิ่งสุดท้ายโปรดตรวจสอบให้แน่ใจว่าทุกอย่างเสร็จสิ้นในช่วงเวลาเดียวกัน หมายความว่าถ้า Oauth เสร็จสิ้นในการสาธิต / นักพัฒนา (account-d.docusign.com) การเรียก API จะถูกสร้างขึ้นใน env เดียวกัน (demo.docusign.net) หากคุณใช้ account.docusign.com (การผลิต) การเรียก API จะต้องเป็น URL ที่ถูกต้องซึ่งจะไม่ใช่ demo.docusign.net (แต่อาจเป็น na3.docusign.net หรือ eu1.docusign.net เป็นต้น)