如何在 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(字符串,可选):每次有新协议事件时 Adobe 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@
作为标题发送。所以我现在真的不知道 Adobe Sign 出了什么问题。 :(
【参考方案1】:
这是 URL RFC 的一部分,是的,因为在 URL 中可以定义用户名和密码,但这取决于发送它的协议。 HTTP 不支持您所描述的内容,它仅通过 Authorization
标头发送 HTTP 身份验证。其他东西坏了,也许是在它到达您之前剥离了标头,也许 Adobe 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 中处理表单验证,尤其是嵌套模型