DocuSign API - 如何在用户认证后获得回调响应?

DocuSign API - How to get callback response after user authentication?

我正在尝试实施 Implicit Grant REST API of DocuSign。我对用户登录后需要立即发生的事情感到困惑。这是一个 stand-alone 本机 Windows 桌面应用程序,而不是 Web 服务或页面。

我打开嵌入式浏览器 window,导航到正确的 URI 进行登录,用户能够成功登录。我在此应用程序中还有一个 HTTP 服务器 运行 以及用于接收回调。事实上,回调确实有效,我确实收到了一个传入的 HTTP GET 命令。但是,此回调响应中没有任何可用的内容。没有特殊的 headers,参数,body,没有。

在我尝试隐式授权 API 之前,我首先尝试了 JWT 授权方法,然后才意识到这不是正确的方法。但我的观点是,至少我在回调命令中有一个 code 参数。但是在切换到使用隐式授权方法之后,这个响应是空的。

根据文档:

After consent has been granted, the Authentication Service verifies that the client application is valid and has access to the requested scope. If so, it redirects the access token to the provided callback URI in a hash fragment.

The response contains the following hash fragment parameters:

.......

它甚至显示了一个示例响应:

http://localhost/#access_token=eyJ0eXAi.....9LyiFrUqvdw&expires_in=28800&token_type=bearer&state=a39fh23hnf23

但是,如前所述,我收到的回调响应没有什么值得注意的价值。它基本上只是空的。

我在这里错过了什么?完成身份验证过程并继续实际使用 API 的正确方法是什么?

注意:我使用的是 Delphi,因此 DocuSign 提供的 none 个示例是兼容的。

Implicit Grant 主要用于移动应用程序,对于桌面应用程序,您需要使用 Authorization Code Grant,使用这种方法,您将在 RedirectUrl 中获取代码。另请注意集成商密钥配置中的 select Authorization Code Grant 无线电选项。

更新答案 当您 没有 将后端服务器作为身份验证流程的一部分时,请使用隐式授权。隐式授权适用于客户端 ID 的秘密/RSA 私钥无法保护的任何时候——任何时候应用程序架构中没有安全服务器。这包括移动应用程序(因为应用程序可以进行逆向工程、单页应用程序(React、Angular 等)和 desktop/thick 客户端应用程序(例如 Delphi 应用程序)。

我在 React 中编写的 DocuSign 应用程序使用隐式授权。

在您的例子中,您正在编写一个完全在桌面上运行的 "thick client app"。

由于 DocuSign 的 OAuth2 隐式授权流程符合标准,因此可以从该框架的其他 OAuth2 身份提供者身份验证示例开始。

对于 Delphi,请参阅 Accessing Facebook API 的示例。虽然与 DocuSign 的隐式授权流程不完全相同,但已经足够接近了。特别要注意,当请求 response_type=token 时,Facebook 如何 returns URL 片段中的访问令牌(如 Delphi 示例中所做的那样)。

引自 Facebook authentication docs:

response_type = token. Response data is included as a URL fragment and contains an access token. Desktop apps must use this setting for response_type. This is most useful when the client will be handling the token.

[已强调]

底线:use/modify Delphi 使用 Facebook 进行身份验证的示例,因为 DocuSign 与此类似。如果无法正常工作,请参考 Facebook 身份验证示例,向 Delphi 客户服务寻求帮助。

PS 解决问题后,请提供您自己的答案(包括您使用的代码),以便将来帮助其他人。谢谢!

我发现我做错了什么。这是一些混乱和术语混淆。当我说我的回调 URI 实际上有效时,这是指它触发了我的 HTTP 服务器从应用程序中侦听 - 但没有可用数据。

然而,我实际上需要做的不是捕获HTTP服务器中的请求,而是捕获嵌入式浏览器在用户身份验证后导航到的URI。一旦我在成功登录后嗅探到这个浏览器的 URI,现在我实际上可以看到 access_token

所以 callback uriredirect uri 是完全相同的东西,但很容易被误解。我对它们有两种不同的定义,回调是响应原始调用者,重定向是指自动从一个页面导航到另一个页面。

现在我很好奇我是否需要一个 HTTP 服务器,或者我是否可以盲目地抛出任何任意重定向 URI(当然是在帐户中注册的)并在嵌入式浏览器导航后获取 URI。

至于为什么我的 HTTP 服务器看不到这些数据,而嵌入式浏览器却看到了,这超出了我的理解范围。它应该在两侧匹配。

仅供参考,我使用的嵌入式浏览器是 Chromium (DCEF3),HTTP 服务器是 Indy 的 TIdHTTPServer 组件。


更新

如评论中所述,HTTP 服务器在设计上不会接收 URI 的 "bookmark" 部分,因为书签只是客户端的东西。根本没有理由将它发送到服务器。因此安全级别 - 由于该信息将仅由客户端而不是服务器使用,因此通过网络将 access_token 发送到服务器是有风险的。所以它将它保存在客户端浏览器的本地。这就是为什么我在浏览器上看到这些数据,而不是在 HTTP 服务器请求处理程序上看到的原因。