如何在 Express (Node.js) 中使用 URL 编码处理 HTTP Basic Auth

How to handle HTTP Basic Auth with URL encoding in Express (Node.js)

我收到来自我们正在使用的 API 的回调 (Adobe Sign API). The only method available to authenticate these callbacks is HTTP Basic Auth, using URL encoding ( 而不是 headers ).

文档:

callbackInfo (string, optional): A publicly accessible url to which Adobe Sign will do an HTTP GET operation every time there is a new agreement event. HTTP authentication is supported using standard embedded syntax - i.e. http://username:password@your.server.com/path/to/file.

如何访问 URL 的 username:password@ 部分以验证凭据?它似乎无法从请求 object 中获得(我将整个 object 转储到 console.error() 并且无法在其中的任何地方找到凭据)。 :(

我正在使用 Express 4.14.0、npm 3.10.8 和 Node.js 7.0.0(如果有帮助,我可以升级到更新的版本)。

遗憾的是,Adobe Sign 支持根本没有帮助。

编辑: 我已经支持 HTTP Basic 身份验证 header (Authorization),但再一次,它是 未在此回调中提供。使用 header 的请求会在我的 nginx 访问日志中显示用户名,但回调不会显示任何用户名(这是有道理的,因为 header 不存在)。唯一可用的凭据位于 URL 的 username:password@ 部分。我什至不知道这是可能的,but apparently it's part of the URL RFC, and still supported today (see section 3.1. Common Internet Scheme Syntax). I'm literally just receiving a simple GET request with no headers at all. Something like https://adobesign:verysecurepassword@myservice.com/callbacks.

对于失败的身份验证,我将返回 401 响应,其中 WWW-Authenticate header 设置为 Basic,但它不会在这种情况下提供帮助(仅使浏览器提示 username/password,但不影响回调)。

那是 URL RFC 的一部分,是的,因为在 URL 中可以定义用户名和密码,但这取决于发送它的协议。 HTTP 不支持您所描述的内容,它仅通过 Authorization header 发送 HTTP 身份验证。其他东西坏了,也许有东西在到达你之前剥离了 header,也许 Adob​​e Sign 发送了一些意外的东西,等等。但是除了 [=19= 之外,HTTP 没有传输该用户名/密码的机制].它只是不在协议中。

此外,您说您将整个请求转储到控制台,尝试转储身份验证 header 和 console.log(req.get('Authorization')); 您可能没有在控制台中看到用户名/密码值,因为它与发送前的冒号和 base64 编码,因此您不会在控制台中看到纯文本。

您可能还希望https://github.com/expressjs/basic-auth-connect更轻松地处理授权请求。