使用请求实现 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 就是将所需的数据填充到一个可用的属性中,例如“刷新令牌”。 “