python - 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(因为该用户只有一个帐户),但由于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 users 键,但这会产生此错误:
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 才能获取访问令牌。这些呼叫是通过冒充该用户进行的。如果您尝试从所述用户没有会员资格的帐户访问信封(或任何东西) - 您会收到错误消息。
最后一件事,请确保所有事情都在同一个版本中完成。这意味着,如果 Oauth 在 demo/developer (account-d.docusign.com) 中完成,那么 API 调用将针对相同的 env (demo.docusign.net)。如果您使用 account.docusign.com(生产),则 API 调用必须是正确的 URL,而不是 demo.docusign.net(但可以是 na3.docusign.net 或 eu1.docusign.net 等)
推荐阅读
- javascript - 外部弹出 onclick 每次会话仅打开一次
- javascript - 如何用cheerio 填充选项值列表的索引号?
- excel - 如何抑制来自 Excel 的 HTML 'HEAD' 请求
- iframe - 如何最大化嵌入式 Google 表格或文档的大小、宽度和高度?
- typescript - 将遗留 JS 包含到 Typescript 模块中
- python - 在没有 matplotlib 的 tkinter 中创建缩放时间线
- python - 返回与指针分配之间的 c_char_p 行为不一致
- html - 超链接图像
- python - 这个合并排序实现的时间复杂度是 O(nlogn) 吗?
- android - 如何更改弹出菜单中项目之间的边距