使用请求实现 Docusign 身份验证
Implementing Docusign Authentication using Requests
我正在创建一个 Airbyte connector for Docusign's E-signature Rest API。
实现连接器的部分过程是编写一个身份验证例程,从 requests.auth
.
扩展 AuthBase
class
问题是 Docusign 不支持 JWT 授权的刷新令牌。根据 docusign documentation:
The access token granted by JWT Grant expires after one hour, and no refresh token is provided. After the token expires, you must generate a new JWT and exchange it for a new access token.
You can reuse most of the old assertion, just modifying the IAT and EXP values and updating the signature, then submit the updated JWT to get a new access token.
Generally, apps that use JWT should get a new access token about 15 minutes before their existing one expires.
但是,requests-authlib
文档中 requests documentation (which links to this page 这部分的“后端应用程序流程”中的所有示例似乎只允许 的 Auth2 工作流包括 一个刷新令牌。
我该如何解决这个问题,以便每次刷新令牌过期时都发出一个新请求(使用更新的 IAT EXP 和签名)?
刷新令牌是 OAuth 授权码授权流程的一项功能。
授权码授予流程需要人对自己进行身份验证。结果是一个 8 小时的访问令牌和一个 30 天的刷新令牌。
要获取新的访问令牌,可以:
- 请人再次验证
- 或者应用可以使用刷新令牌获取新的访问令牌。这可以由应用程序自动完成,无需人工干预。
对于 JWT 授权流程, 没有人工也没有刷新令牌。相反,该应用程序只是 re-runs JWT 授权流程并接收一个新的 1 小时访问令牌。
当您 re-do JWT 流程时,创建一个新的 JWT(更新的 IAT、EXP 等)。使用您的私钥对其进行签名,并将其发送至 DocuSign 以获取新的访问令牌。
JWT 操作足够便宜,每个模拟用户每小时执行一次。但是您必须缓存访问令牌和 而不是 re-do 每个 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
已添加
回复:
[I need to] extend the AuthBase class from requests.auth
如果应用的架构要求您扩展 AuthBase class,那么您将需要在 AuthBase class.
中实施 JWT 授权流程
如果 AuthBase class 不允许您访问 JWT 授权流程所需的数据,那么一个 hack 就是将所需的数据填充到一个可用的属性中,例如“刷新令牌”。 “
我正在创建一个 Airbyte connector for Docusign's E-signature Rest API。
实现连接器的部分过程是编写一个身份验证例程,从 requests.auth
.
AuthBase
class
问题是 Docusign 不支持 JWT 授权的刷新令牌。根据 docusign documentation:
The access token granted by JWT Grant expires after one hour, and no refresh token is provided. After the token expires, you must generate a new JWT and exchange it for a new access token.
You can reuse most of the old assertion, just modifying the IAT and EXP values and updating the signature, then submit the updated JWT to get a new access token. Generally, apps that use JWT should get a new access token about 15 minutes before their existing one expires.
但是,requests-authlib
文档中 requests documentation (which links to this page 这部分的“后端应用程序流程”中的所有示例似乎只允许 的 Auth2 工作流包括 一个刷新令牌。
我该如何解决这个问题,以便每次刷新令牌过期时都发出一个新请求(使用更新的 IAT EXP 和签名)?
刷新令牌是 OAuth 授权码授权流程的一项功能。
授权码授予流程需要人对自己进行身份验证。结果是一个 8 小时的访问令牌和一个 30 天的刷新令牌。
要获取新的访问令牌,可以:
- 请人再次验证
- 或者应用可以使用刷新令牌获取新的访问令牌。这可以由应用程序自动完成,无需人工干预。
对于 JWT 授权流程, 没有人工也没有刷新令牌。相反,该应用程序只是 re-runs JWT 授权流程并接收一个新的 1 小时访问令牌。
当您 re-do JWT 流程时,创建一个新的 JWT(更新的 IAT、EXP 等)。使用您的私钥对其进行签名,并将其发送至 DocuSign 以获取新的访问令牌。
JWT 操作足够便宜,每个模拟用户每小时执行一次。但是您必须缓存访问令牌和 而不是 re-do 每个 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
已添加
回复:
[I need to] extend the AuthBase class from requests.auth
如果应用的架构要求您扩展 AuthBase class,那么您将需要在 AuthBase class.
中实施 JWT 授权流程如果 AuthBase class 不允许您访问 JWT 授权流程所需的数据,那么一个 hack 就是将所需的数据填充到一个可用的属性中,例如“刷新令牌”。 “