问题描述
我正在为Docusign's E-signature Rest API创建Airbyteconnector。
实现连接器的过程的一部分是编写身份验证例程,该例程从requests.auth
扩展AuthBase
类。
问题是DocuSign不支持JWT授权的刷新令牌。根据docusign documentation:
JWT Grant授予的访问令牌将在一小时后过期,不提供刷新令牌。令牌过期后,您必须生成新的JWT并将其交换为新的访问令牌。
您可以重用大多数旧断言,只需修改IAT和EXP值并更新签名,然后提交更新的JWT以获得新的访问令牌。 通常,使用JWT的应用应该在现有访问令牌过期前大约15分钟获得新的访问令牌。
但是,requests documentation(它链接到requests-authlib
文档中的this page)这一部分的后端应用程序流中的所有示例似乎只允许包括刷新令牌的Auth2工作流。
我如何解决此问题,以便每次刷新令牌过期时,都会发出新的请求(具有更新的IAT EXP和签名)?
推荐答案
刷新令牌是OAUTH授权码授予流的一项功能。
授权码授予流需要人工对自己进行身份验证。结果是8小时访问令牌和30天刷新令牌。
要获取新的访问令牌,请执行以下操作:
- 要求用户重新进行身份验证
- 或者应用程序可以使用刷新令牌来获取新的访问令牌。这可以由应用程序自主完成,而不会打扰人类。
对于JWT授权流,没有人工令牌,也没有刷新令牌。相反,该应用程序只需重新运行JWT授权流程,并接收新的1小时访问令牌。
当您重新执行JWT流时,创建一个新的JWT(更新了IAT、EXP等)。使用您的私钥对其进行签名,并将其发送到DocuSign以获取新的访问令牌。
JWT操作足够便宜,每个模拟用户每小时执行一次。但您必须缓存访问令牌,并且不能为每个API调用重新执行JWT授权流...
Python验证库
大多数语言的大多数验证库都侧重于授权码授予流,因为这是最常用的OAuth流。
但正如您所指出的,您使用的是JWT流。这意味着您不能使用这些库。相反,你将需要推出自己的产品。好消息是,这并不是太难。以下是我的伪代码:
Send_an_API_request(url, request_details, etc):
access_token = Get_access_token(user_id);
api_results = send_api_request(access_token, url, request_details, etc)
return api_results;
Get_access_token(user_id):
(access_token, expire_time) = database_lookup(user_id);
# if access_token is about to expire or we don't have one,
# create a new access_token and store it
if (
((current_time + 10minutes) > expire_time)
or
(access_token is null)
):
# Make a new JWT request
jwt = make_jwt(user_id);
signed_jwt = sign(jwt, private_key)
(access_token, expire_sec) = send_jwt_request(signed_jwt)
database_store (user_id, access_token, current_time + expire_sec)
return access_token
已添加
回复:
[我需要]从quests.auth扩展AuthBase类
如果应用程序的体系结构要求您扩展AuthBase类,则需要在AuthBase类中实现JWT授权流。
如果AuthBase类不允许您访问JWT授权流所需的数据,则黑客可以将所需数据填充到可用的属性中,例如刷新标记。";
这篇关于使用请求实现DocuSign身份验证的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!