DocuSign API JWTの問題(Python)
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用に提供されているライブラリを介して行われます。
ここからどこに行くのかよくわかりませんが、助けていただければ幸いです。
回答
ここに役立つかもしれないいくつかの情報があります。
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などである可能性があります)。