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から見つかったアカウントIDを使用しようとしましたが(ユーザーのアカウントは1つしかないため)、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は1つのもの(GUID)であり、accountIDは別のもの(GUID)です。メンバーになっているアカウントからのみエンベロープにアクセスできます。JWTを使用する場合は、アクセストークンを取得するためにuserIdを指定する必要があります。呼び出しは、このユーザーになりすまして行われたものです。そのユーザーがメンバーシップを持っていないアカウントからエンベロープ(または何か)にアクセスしようとすると、エラーが発生します。

最後に、すべてが同じAVで行われるようにしてください。つまり、Oauthがデモ/開発者(account-d.docusign.com)で行われる場合、API呼び出しは同じ環境(demo.docusign.net)に対して行われます。account.docusign.com(本番)を使用する場合、API呼び出しはdemo.docusign.netではない正しいURLである必要があります(ただし、na3.docusign.netまたはeu1.docusign.netなどである可能性があります)。