如何在 Express (Node.js) 中使用 URL 编码处理 HTTP 基本身份验证

Posted

技术标签:

【中文标题】如何在 Express (Node.js) 中使用 URL 编码处理 HTTP 基本身份验证【英文标题】:How to handle HTTP Basic Auth with URL encoding in Express (Node.js) 【发布时间】:2017-06-03 09:22:01 【问题描述】:

我正在接收来自我们正在使用的 API (Adobe Sign API) 的回调。唯一可用于验证这些回调的方法是 HTTP Basic Auth,使用 URL encoding(不是标头)。

文档:

callbackInfo(字符串,可选):每次有新协议事件时 Adob​​e Sign 都会对其执行 HTTP GET 操作的可公开访问的 URL。使用标准嵌入式语法支持 HTTP 身份验证 - 即http://username:password@your.server.com/path/to/file。

如何访问 URL 的 username:password@ 部分以验证凭据? Request 对象似乎无法使用它(我将整个对象转储到 console.error() 并且在其中的任何地方都找不到凭据)。 :(

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

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

编辑:我已经支持 HTTP 基本身份验证标头 (Authorization),但在此未提供打回来。使用标头的请求使用用户名显示在我的 nginx 访问日志中,但回调不显示任何用户名(这是有道理的,因为标头不存在)。唯一可用的凭据位于 URL 的 username:password@ 部分。我什至不知道这是可能的,but apparently it's part of the URL RFC,并且今天仍然支持(参见3.1. Common Internet Scheme Syntax 部分)。我实际上只是收到一个根本没有标头的简单 GET 请求。类似https://adobesign:verysecurepassword@myservice.com/callbacks。

对于失败的身份验证,我将返回一个 401 响应,并将 WWW-Authenticate 标头设置为 Basic,但在这种情况下它没有帮助(只会让浏览器提示输入用户名/密码,但不影响回调)。

【问题讨论】:

可能想看看这个gist.github.com/charlesdaniel/1686663。看起来很有希望。 @realseanp 那是使用authorization 标头,这很容易实现,但在这种情况下没有帮助(标头不存在;username:password 作为网址) HTTP 协议仅在标头中发送基本身份验证user:pass。您是否发送 WWW-Authenticate 标头以请求回调 url?当第一个请求以 HTTP 401 响应时,回调 url 可能会再次使用授权标头进行 ping。试试这个 ***.com/a/33905671/1921546 只有 url after host:port 的部分在标头之前发送。如果您确定这部分有user:pass,请检查其查询参数。 @pii_ke 不正确;查看我更新中的 URL RFC。我还发送了WWW-Authenticate 标头,但这对回调没有帮助。 user:pass 也不在查询参数或 Request 对象的任何其他元素中。 实际上,@pii_ke 你是对的(见下面的答案)。当我在我这边测试时,username:password@ 作为标题发送。所以我现在真的不知道 Adob​​e Sign 出了什么问题。 :( 【参考方案1】:

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

另外,您说您将整个请求转储到控制台,尝试使用 console.log(req.get('Authorization')); 转储 auth 标头您可能没有在控制台中看到用户名/密码值,因为它在发送前与冒号和 base64 编码相结合,所以你不会在控制台中看到纯文本。

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

【讨论】:

谢谢,我会再看一遍。确实,当我在 url 中发送 username:password@ 时,它会成为我测试过的所有客户端的标题。我完全忘记了它不会以纯文本(x_x)显示。所以这至少是解决问题的一部分。我正在使用github.com/http-auth/http-auth,它在我这边工作得很好,只是没有回调。回到第一格!

以上是关于如何在 Express (Node.js) 中使用 URL 编码处理 HTTP 基本身份验证的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Node.js / Express.js 中将中间件放在它自己的文件中

如何在 Express (Node.js) 中使用 URL 编码处理 HTTP 基本身份验证

如何在 node.js + Express 中同时支持 json 和 jsonp 响应?

您如何在 Node.js + Express + Mongoose + Jade 中处理表单验证,尤其是嵌套模型

如何启用调试 express.js/node.js 应用程序

如何检查用户是不是在 Firebase 和 Express/Node.js 中经过身份验证?