oauth-2.0 - 使用 Jwt Oauth2 授权的 Docusign 嵌入式签名,无需客户登录/同意
问题描述
在我的 laravel 应用程序中,我必须将嵌入式签名与 docusign 与 jwt oauth2 集成,而无需客户登录/同意窗口。应用开发者在docusign有一个账号,客户没有账号。客户必须使用 docusign 进行嵌入式签名(由应用程序开发人员在 docusign 帐户中设置),而无需征得任何同意/登录。
为此,我应该使用 phpSDK 中的 requestJWTApplicationToken/requestJWTUserToken 哪个函数?我必须使用什么范围?不应出现同意/登录窗口。我们应该怎么做?
解决方案
诀窍是您的用例涉及两个不同的用户。
用户 1 是您公司中登录 DocuSign 系统的人。对于签名场景,这通常是“系统用户”,例如“finance@your_company.com”——而不是真实的人。
用户 2 是签名者。他们通常没有登录 DocuSign。他们不需要登录 DocuSign。
以下是步骤:
- 签名者用户 2
Sign
在您的应用程序上按下一个按钮。 - 您的应用程序在后端服务器中使用 JWT 用户令牌调用,正如 Ben 建议的那样,为用户 1 创建一个 access_token。(保存/缓存访问令牌,仅在需要时创建一个新令牌。)
- 您的应用程序在后端使用访问令牌创建/发送 DocuSign 信封,并从 DocuSign 获取信封的签名仪式 URL。
- 您的应用程序将用户的浏览器重定向到 Signing Ceremony URL
- 签名者(用户 2)完成签名后,他们的浏览器将被重定向回您的应用程序。
笔记:
- 同意过程是一次性步骤,由用户 1 或代表他们通过管理同意完成。详情。
- 如果您不想将用户的浏览器从您的应用程序重定向到签名仪式,作为替代方案,您可以为签名仪式打开一个新的浏览器选项卡,然后在签名完成后以编程方式将其关闭。
- 在上面显示的步骤(JWT 流程、创建信封、获取 Signing Ceremony URL)中,向用户提供忙碌指示符是个好主意,这样他们就可以放心有事情发生了。
添加
来自OP的Q:
因此,我们的应用程序必须运行一个脚本来为我们的应用程序后端的文档帐户用户(user1)创建一次 jwt 访问令牌,并使用带有 rest api 的单个访问令牌,前端中的每个客户(如 user2)都可以签署文档. 我们必须将后端脚本保存在 cron 中,以便在令牌过期之前,我们将为 user1 获得一个新的访问令牌,并将这个新令牌用于进一步的 rest api 调用。正确的?
A:正确,除了 cron 作业。由于 JWT 访问令牌持续一个小时,因此不适合使用 cron 作业。相反,实现一个check_token
类似(伪代码)的后端方法:
function check_token
# Returns a DocuSign access token or raises an error
$access_token = get_access_token_from_cache(); # May return null
$access_token_expires = get_access_token_expires_from_cache()
$current_datetime = get_current_time();
if ($access_token == null ||
$access_token_expires < $current_datetime)
then begin
# need a new access token
($access_token, $expires_in) = jwt_get_access_token()
# Note that the $expires_in is in seconds.
# Use the $expires_in to calculate an $access_token_expires
# datetime. Use a 10 minute buffer period to not try using
# the access_token when it gets close to expiring
$current_datetime = get_current_time();
# The following is not in PHP! It is pseudo code
$access_token_expires = date_add_seconds($current_datetime,
$expires_in - (10 * 60));
store_access_token_in_cache($access_token);
store_access_token_expires_in_cache($access_token_expires);
end
return ($access_token)
end function
笔记
access_token 和 access_token_expires 值是为整个应用程序缓存的,而不是每个会话。如果您的应用程序有一个数据库,您可以将值存储在那里。或者使用服务器上的文件。或者,如果您使用的是 Linux,则使用 sharedMemory 缓存。等等。
推荐阅读
- java - 用于固定组件位置和可滚动窗口的 Java GUI 布局
- mongodb - 使用 Spark 3.x 从 AWS EMR 6.1.0/6.2.0 访问 MongoDB Atlas
- c++ - Portaudio.dll 无法在 VS 中正确链接
- android - 为什么我没有在 Android Studio 4.1 中创建新活动的选项?
- javascript - 如何显示/隐藏具有随机计时功能的 div
- typescript - 如何使用打字稿处理在 Playwright Automation 中同时打开的多个弹出窗口
- r - 如何使用 R 根据数据框中各个列中的最小值对特定列中的行进行子集化
- python - 找不到模块(或其依赖项之一)。尝试使用带有构造函数语法的完整路径
- bash - #字符在grep中是什么意思?
- java - 我应该将多态性用于简单的 switch 语句吗?