DocuSign API JWT 问题 (Python)
DocuSign API JWT Issue (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(因为用户只有一个帐户)但是在 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 是一回事 (GUID),accountID 是另一回事 (GUID)。
您只能从您所属的帐户访问信封。
使用 JWT 时,您必须提供 userId 才能获取访问令牌。
这些电话是通过冒充该用户进行的。如果您尝试从该用户没有会员资格的帐户访问信封(或任何东西)- 您会收到错误消息。
最后一件事,请确保一切都在同一个 anv 中完成。意思是,如果 Oauth 在 demo/developer (account-d.docusign.com) 中完成,那么 API 调用是对同一个环境 (demo.docusign.net) 进行的。如果您使用 account.docusign.com(生产),那么 API 调用需要正确的 URL 而不是 demo.docusign.net(但可能是 na3.docusign.net或 eu1.docusign.net 等)
在使用 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(因为用户只有一个帐户)但是在 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 是一回事 (GUID),accountID 是另一回事 (GUID)。 您只能从您所属的帐户访问信封。 使用 JWT 时,您必须提供 userId 才能获取访问令牌。 这些电话是通过冒充该用户进行的。如果您尝试从该用户没有会员资格的帐户访问信封(或任何东西)- 您会收到错误消息。
最后一件事,请确保一切都在同一个 anv 中完成。意思是,如果 Oauth 在 demo/developer (account-d.docusign.com) 中完成,那么 API 调用是对同一个环境 (demo.docusign.net) 进行的。如果您使用 account.docusign.com(生产),那么 API 调用需要正确的 URL 而不是 demo.docusign.net(但可能是 na3.docusign.net或 eu1.docusign.net 等)